汇编寄存器esp和ebp

And*_*rei 16 assembly intel cpu-registers

我目前正在学习英特尔处理器的组装.由于堆栈"渐渐减少",为什么我们必须添加才能访问特定元素

[ebp + 8] ;; This will access the first param
Run Code Online (Sandbox Code Playgroud)

我知道我们必须跳过旧的ebp值和返回地址,这就是我们使用8的原因(因为每个都是4个字节长).这有点奇怪.

另外,如果ebpesp的备份副本,那么主函数Ex中的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
Run Code Online (Sandbox Code Playgroud)

而且当我们为本地人分配内存时,我们必须从ebp中减去...请给出一个非模棱两可的答案.谢谢!

nin*_*alj 14

初始值%ebp通常为0.这样调试器就知道何时在回溯中链接链后面.

您应该将其%ebp视为参考点.为方便起见,它位于函数参数和局部变量之间.这样,您可以访问具有正偏移的参数和具有负偏移的变量,因此很容易判断您是在访问变量还是参数.


Bri*_*uch 3

正如你所说,堆栈会向下增长。因此,您可以通过减去来增加当地人的堆栈。您添加以在堆栈中查找存储在那里的元素。