我目前正在学习英特尔处理器的组装。 由于堆栈“长大”,为什么我们必须添加才能访问特定元素
[ebp + 8] ;; This will access the first param
我知道我们必须跳过旧的ebp值和返回地址以及我们使用8的原因(因为每个都是4个字节长)。 这有点奇怪。
另外,如果 ebp 是 esp 的备份副本,那么主要功能中的ebp值是多少? 例如:
_start:
;; what's ebp value here ?
push eax
push ebx
call someFunction ;; this will create a stack frame
+-----------+
| param1 |
+-----------+
| param0 | <--- this is [ebp + 8] ( assuming mov ebp, esp )
+-----------+
|ret_address|
+-----------+
| ebp |
+-----------+ <--- esp
而且当我们为本地人分配内存时,我们必须从ebp中减去...... 请给出一个非模棱两可的答案。 谢谢!
答案 0 :(得分:14)
%ebp
的初始值通常为0.这样调试人员就知道何时在回溯中链接链后面。
您应该将%ebp
视为参考点。为方便起见,它位于函数参数和局部变量之间。这样,您可以访问具有正偏移的参数和具有负偏移的变量,因此很容易判断您是在访问变量还是参数。
答案 1 :(得分:2)
就像你说的那样,堆栈会逐渐减少。因此,您减去为本地人增加堆栈。您可以添加回堆栈中存储的元素。