我必须学习汇编,我对不同的寄存器做什么/指向什么感到很困惑。
最佳答案
在某些架构上,例如 MIPS,所有寄存器都是平等的,除了寄存器的名称(和软件约定)之外,实际上没有任何区别。在 x86 上,您通常可以将任何寄存器用于通用计算,但有些寄存器隐式绑定(bind)到指令集。
可以在 here 中找到有关寄存器特殊用途的大量信息。
例子:
eax
,累加器:许多算术指令隐式操作 eax
。许多指令也有特殊的较短的 EAX 特定编码:例如,add eax, 123456
比 add ecx, 123456
短 1 个字节。 ( add eax, imm32
vs. add r/m32, imm32
)ebx
, base:很少隐式使用,但 xlat
是与“Base”命名相匹配的。仍然相关: cmpxchg8b
。因为位置无关代码 (PIC) 中的某些 32 位调用约定/ABI use it as a pointer to the "global offset table" 很少需要它。 edx
,数据:一些算术运算隐式地对 edx
中的 64 位值进行操作:eax
ecx
,用于移位计数和 rep movs
的计数器。此外,mostly-obsolete loop
instruction 隐式递减 ecx
esi
,源索引:一些字符串操作从esi
指向的内存中读取一个字符串edi
,目标索引:一些字符串操作将字符串写入 edi
指向的内存。例如 rep movsb
将 ECX 字节从 [esi]
复制到 [edi]
。 ebp
,基指针:通常用于指向局部变量。 leave
隐式使用。 esp
,堆栈指针:指向堆栈的顶部,由 push
, pop
, call
和 ret
隐式使用x86 指令集是一个复杂的野兽,真的。许多指令具有较短的形式,隐含地使用一个或另一个寄存器。一些寄存器可用于进行某些寻址,而另一些则不能。
Intel 80386 Programmer's Reference Manual 是一个不可替代的资源,它基本上告诉您有关 x86 程序集的所有信息,除了现代硬件上的更新扩展和性能。
PC Assembly (e)book 是学习汇编的绝佳资源。
关于pointers - 有人可以向我解释(用非常简单的术语)esp、ebp 和 esi 寄存器之间的区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738595/