我怎么觉得ebp/esp有一个就够了?
指示当前栈底的位置就可以了啊?
变量的位置在这个基础上计算一个偏移就可以了
为什么要两个寄存器?
[解决办法]
两个不同作用的寄存器。 ESP(堆栈指针)受push/pop指令影响而变化;而EBP用于栈内操作,在利用堆栈传递参数给子程序的时候,EBP的用途就显现出来了。
[解决办法]
理论上来说,只用一个esp来寻址栈空间是完全可以的,但是会给编译器生成代码带来一个不便之处,访问局部变量和参数的指令,会随着栈push、pop操作,在不同位置访问同一个局部变量、参数的相对地址不一样。
在常规情况下,一个函数的入口代码这样处理:
push ebp
mov ebp,esp
sub esp,xxxx ; 保留局部变量的空间
...
然后,在函数退出之前,ebp一般不修改,访问局部变量用[ebp-xx],访问参数用[ebp+xx],这样不管代码中怎么push、pop,只要不修改ebp,在任何位置访问同一个局部变量、参数的相对地址都是一样的。
但是也有某些编译器,比如icc,某些情况下确实会生成不使用ebp,完全靠esp访问局部变量和参数的代码。
[解决办法]
哈哈,我也有一个问题,我觉得,处理器有sub指令就可以了,何必再加一个inc ?
ebp的设立,纯粹是为了方便。如果没有ebp,访问过程参数的时候必然会是这样:
mov edi,esp push eax push ebx push ecx push edx mov eax,[ss: edi+0x04] ;取第一个参数 mov ebx,[ss: edi+0x05] ;取第二个参数 ;其它指令 ret 8 ;返回主程序并修改堆栈指针
[解决办法]
不好意思,上面的代码个别语句有问题。现重发如下:
mov edi,esppush eaxpush ebxpush ecxpush edxmov eax,[ss: edi+0x04] ;取第一个参数mov ebx,[ss: edi+0x08] ;取第二个参数;其它指令ret 8 ;返回主程序并修改堆栈指针
[解决办法]
使用EBP做寻址指针的时候默认使用SS做段寄存器,EBP访问栈内数据很方便,ESP只能指向栈顶
[解决办法]