-1

最初,ESP 指的是内存的空白空间。

当我push 1之类的东西时,它会引用1的内存位置,还是下一个空白空间?

这是示例

push    ebp
mov ebp, esp
/*
---------
(empty space)    <- esp, ebp
---------
ebp     (initially stack pointer was here)
---------
*/

另一个问题是,当我做一个空的堆栈空间时,ESP会指向哪个点?

这是示例:(每个内存位置为 4 个字节)

/*
  --------
1        <- initial esp
  --------
*/
sub esp, 12
; now esp points to this one 
/*
  --------
4          <- esp
  --------
3
  --------
2  
  --------
1        
  --------
*/
; or this one
/*
  --------
3           <- esp
  --------
2  
  --------
1        
  --------
*/

假设数字是内存位置地址

4

1 回答 1

3

手册 ( https://www.felixcloutier.com/x86/push ) 中的操作部分显示 push存储到[ESP].

            ESP ← ESP – 4;
            Memory[SS:ESP] ← SRC;
                (* push dword *)

pop做相反的事情:从[ESP]ESP 加载然后修改。

与许多其他 ISA(例如 ARM)一样,x86 使用“完整”堆栈,其中堆栈指针通常指向最后推送的内容,而不是指向其下方的空白空间。


有趣的事实:递增pop esp覆盖 ESP ,所以它就像. 在递减 ESP之前读取要存储的值。英特尔的手动条目记录了这一点,但它们的伪代码不匹配。请参阅什么是 pushl/popl %esp 的程序集级表示?适用于所有情况的正确推送/弹出伪代码,甚至和.mov esp, [esp]
push esppush esppop esp


回复:第 2 部分:add esp, 12将 ESP 移动 12 个字节,或 12B/4B = 3 个“堆栈槽”。1+3 = 4。

于 2019-01-04T20:24:34.367 回答