最初,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
--------
*/
假设数字是内存位置地址
答案 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。