我可以在不使用 EBX 的情况下编写程序集吗?

-2 x86 assembly cpu-registers

我并不真正理解 EBX 寄存器的用途。我通过搜索 EBX 的目的得到了不同的答案,但最普遍的共识是 EBX 没有像 EAX、ECX 或 EDX 那样的特殊目的。为什么我需要使用 EBX?我已经从简单的教程中删除了 EBX,该程序仍然有效。那么使用EBX的原因是什么?如果没有它我也能工作,我为什么要关心它?

Pet*_*des 7

有一个额外的寄存器意味着你可以在寄存器中保存更多的东西,而不必存储/重新加载它。这就是 x86-64 添加 R8..R15 的原因,尽管它们几乎没有任何特殊用途。

你几乎完全倒退着看这件事。所有通用寄存器都有一些隐含的用途,但这不是原因它们存在。x86 可以在没有“字符串”指令和 EDI 或 ESI 寄存器的情况下设计,或者没有很多东西,但是编写高效的代码会更困难。

(对“为什么存在 x86 寄存器”的更基本答案是 8086 的原始设计,它旨在使从 8080 移植 asm 源代码足够简单,可以机械地完成 。https://retrocomputing.stackexchange.com/questions/5121/为什么是第一个四 x86-gprs-以这种不直观的顺序命名- 这就是为什么在 x86 机器代码中,寄存器号是 EAX、ECX、EDX,然后是 EBX)


但是是的,EBX 确实有一些隐含的用途。在现代代码中,特别是对于cpuid4 个输出之一和cmpxchg8b/cmpxchg16b。在历史 x86 中,作为 的基址寄存器xlatb,在 16 位寻址模式中作为可用于寻址模式的少数寄存器之一。

请参阅为什么 rbp 和 rsp 称为通用寄存器?其中包括对所有 8 个“传统”寄存器和 R11 的隐式使用。

在 i386 Linux 系统调用调用约定中,EAX 保存调用号,EBX 保存第一个 arg,然后是 ECX、EDX 等。但是如果 EBX 不存在,调用约定显然会被设计成不同的。

  • 除非您正在编写一些琐碎的内容,否则通常“所有”寄存器都应该很忙。 (3认同)
  • @notevention:您仍然使用 EBX 作为那些“int 0x80”Linux 系统调用的参数,您只是依赖于 Linux 在静态可执行文件中将其(以及除 ESP 之外的其他寄存器)初始化为“0”的行为。事实上,当您在终端上运行程序时, fd=0 stdin 文件描述符引用相同的读写文件*描述*。(即,在终端读写打开时,stdin 和 stdout 彼此重复)。如果您从像“strace ./my_prog < /dev/null”这样的文件重定向其输入,它将失败。 (2认同)