19

例如,如果我推 ax 是 [SP] 指向我的 ax 值还是 ax 后面的单词?它也不同于实模式和保护模式吗?我问这个是因为汇编艺术书说明并解释了 sp 指向最后推送的数据,并且在此页面上OSDev Wiki - Stack它说明了它指向最后推送数据后的空字。

4

4 回答 4

29

维基百科在这里说:

堆栈是通过隐式递减(推送)和递增(弹出)堆栈指针实现的。在 16 位模式下,这个隐式堆栈指针被寻址为 SS:[SP],在 32 位模式下它是 SS:[ESP],而在 64 位模式下它是 [RSP]。堆栈指针实际上指向最后存储的值,假设它的大小将匹配处理器的操作模式(即 16、32 或 64 位)以匹配 push/pop/call 的默认宽度/ret 指令。

这也是我的回溯记忆所说的方式。

于 2012-12-27T19:56:03.863 回答
23
push eax

相当于:

sub esp, 4
mov [esp], eax

所以在推送之后,esp将保存推送值的地址。

于 2012-12-27T19:59:43.543 回答
1

根据 Lee Meador 和 Cory Nelson 的回答,堆栈指针指向最后一个被推送的值。

来自英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷(2A、2B 和 2C):指令集参考,AZ,PUSH 指令描述的第一行如下:

递减堆栈指针,然后将源操作数存储在堆栈顶部。

于 2017-06-23T00:45:00.220 回答
0

我想我明白为什么 OP 会问这个问题。为什么第一个变量是来自 SP 的 8 个字节而不是 4 个?

经过一些研究,我发现表明:

SP+0 是旧的 EBP SP+4 是旧的 EIP(指令指针)

因此,自然地,第一个参数是 SP+8。

于 2015-08-23T18:36:15.403 回答