首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

小弟我如何觉得ebp/esp有一个就够了

2012-03-26 
我怎么觉得ebp/esp有一个就够了?指示当前栈底的位置就可以了啊?变量的位置在这个基础上计算一个偏移就可以

我怎么觉得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,访问过程参数的时候必然会是这样:

Assembly code
    mov edi,esp    push eax    push ebx    push ecx    push edx    mov eax,[ss: edi+0x04]    ;取第一个参数    mov ebx,[ss: edi+0x05]    ;取第二个参数     ;其它指令     ret 8                 ;返回主程序并修改堆栈指针
[解决办法]
不好意思,上面的代码个别语句有问题。现重发如下:
Assembly code
mov edi,esppush eaxpush ebxpush ecxpush edxmov eax,[ss: edi+0x04]    ;取第一个参数mov ebx,[ss: edi+0x08]    ;取第二个参数;其它指令ret 8                     ;返回主程序并修改堆栈指针
[解决办法]
使用EBP做寻址指针的时候默认使用SS做段寄存器,EBP访问栈内数据很方便,ESP只能指向栈顶
[解决办法]
探讨
指示当前栈底的位置就可以了啊?

变量的位置在这个基础上计算一个偏移就可以了

为什么要两个寄存器?

[解决办法]
多给你了,你就可以灵活运用了
[解决办法]
又是一个老问题!
楼主你可以看一下汇编中有关堆栈传递参数相关的章节,还有看一下简单C语言编写的带参数的函数的汇编代码!答案就知道了

热点排行