reg 的值和 reg 的地址之间的差异

Difference between value of reg, and adress of reg

这有什么不同?:

movl 4(%esp), %eax # put old ptr into eax
9 popl 0(%eax)

第一条指令将第一个arg的内容放入%eax,但第二条指令也是如此(堆栈的最顶层内容),还是间接寻址? %eax中的值不会相互重叠吗?

0(%eax)是存储在eax中地址的内存位置。 %eaxeax的内容。两者并不等同。另请注意,x86 使用完全降序堆栈,因此 pop 0(%eax) 等同于

mov (%esp), 0(%eax)
add , %esp

即它从 (%esp) 加载,而不是 4(%esp) 作为您的其他指令。 pop 还会更改 esp 的值,而 mov 4(%esp), %eax 不会。 (还要注意 mov (%esp), 0(%eax) 实际上不是有效指令,这只是为了说明原理)。

寄存器的 value/contents 可用于形成读取或写入的内存地址(也称为 dereference), in what are called addressing modes.

0(%eax)4(%esp)有时被称为位移寻址模式(或基数+位移),其中用于内存访问的地址是[=12中的值之和=] 与立即数(此处为 0),以及 %esp 中的值与立即数 4 的总和。寻址模式可以减少所需指令的数量,因为不需要单独的指令和临时寄存器来执行加法(这里说 %esp4)。位移类型是最常见的寻址方式之一,用于访问基于内存的局部变量和对象的字段(实例变量)等。


寄存器提供的存储空间非常有限,但速度非常快,超出了内存。寄存器本身没有像内存位置这样的地址;它们不能像内存那样被索引或寻址——它们只能在指令中命名。寄存器可以保存内存地址,用于访问内存(通过寻址方式解引用),但寄存器不能保存寄存器地址(没有寄存器地址)。