程序集中的堆栈指针。 ESP点是否总是空白?

时间:2019-01-04 20:13:15

标签: assembly x86 callstack stack-pointer

最初,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        
  --------
*/

假设数字是内存位置地址

1 个答案:

答案 0 :(得分:2)

手册(https://www.felixcloutier.com/x86/push中的“操作”部分显示,推送将ESP之前的 修改为[ESP]

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

pop则相反:从[ESP]加载,然后修改ESP。

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


有趣的事实:pop esp在递增后会覆盖ESP ,所以就像mov esp, [esp]
push esp在递减ESP之前 读取要存储的值。英特尔的手册条目对此进行了记录。


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