在汇编语言中,EAX、EBX和ECX有什么区别?

18

我正努力学习汇编语言,但是有些基本概念难以理解。EAX、EBX和ECX只是变量吗?它们除了存储值之外还有独特的用途吗?


4
以下是不同的处理器寄存器。汇编语言中没有变量。你应该阅读一份详细的汇编入门教程,以了解这些基础知识... - Erlkoenig
@Erlkoenig 好的,谢谢。 - Fritiof Rusck
2个回答

26
eax, ebx, ecx等实际上是寄存器,可以看作是类似于高级语言变量的"硬件"变量。通过指令如movaddcmp,可以直接在软件中使用寄存器。前缀e代表extended,意味着寄存器宽度为32位。另一方面,64位寄存器以r开头。

这些寄存器并不总是用于下面所示的目的。此图显示了Linux 64位ABI的寄存器使用情况。

Linux 64-bit ABI

尽管此捕获中未描述所有寄存器。例如,*ip是一个特殊的寄存器(进程计数器),它保存下一条要执行的指令。

您可以在完整的ABI中找到。某些信息是特定于Linux的,但大多数仍然适用于任何POSIX兼容系统。


完整的ABI在这里(链接已损坏):https://www.intel.com/content/dam/develop/external/us/en/documents/mpx-linux64-abi.pdf - z4nzi
1
请注意,一些指令具有隐含的寄存器(muldivcwdxlatmovsb/w/dlooprdtsc等),在选择寄存器时非常重要(特别是在程序的中间);在纯汇编中,ABI大多数情况下是无关紧要的(当您不将汇编与其他语言混合使用,如C,并且不强制遵守不同语言编译器所期望的任何内容时)。 - Brendan

9

EAX, EBX, ECX, EDX, EBP, EDIESI寄存器都是32位通用寄存器,用于临时数据存储和内存访问。

https://web.archive.org/web/20191114093028/https://gerardnico.com/computer/cpu/register/general

一些CPU指令修改特定寄存器。例如,movsbESI获取源地址,从EDI获取目的地,复制一个字节并更改ESI和EDI寄存器。
换句话说,您可以将它们用作变量,但在使用特定指令时,它们也可能具有特定的目的。
您可能需要查阅参考资料。英特尔和AMD都提供在线手册。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接