当前位置: 代码迷 >> 汇编语言 >> 关于ebp esp有的一点小疑问解决思路
  详细解决方案

关于ebp esp有的一点小疑问解决思路

热度:3700   发布时间:2013-02-26 00:00:00.0
关于ebp esp有的一点小疑问
子程序开头是这样的
push ebp
move ebp,esp
sub esp,4
这样运行时没有问题,但我改成
push ebp
sub esp,4
move ebp,esp
仅仅是掉个顺序,就会有问题
这是为什么呢

------解决方案--------------------------------------------------------
看到子程的末尾的 
mov esp, ebp
pop ebp
ret
了没?这里也要对应着改啊,不然你 sub esp, 4 不就堆栈不平衡了么。还不明白的话,在子程开始时记下来 esp 的内容,再在子程最后那里比较下。
------解决方案--------------------------------------------------------
这里用到了ebp,因为我们无法用esp做指针,因为esp随时可能变化的,所以用ebp做指针。代码:
push ebp ;将ebp的值入栈
move ebp,esp ;把esp的值给ebp,让ebp当做指针
sub esp,4 ;这里就改变了esp,esp-4就是将栈顶指针向上移动,预留出空间来给局部变量
所以,你先修改了esp,然后又把值付给ebp做指针当然是错误了。
这里push和pop是会不对称出现的,因为就用ebp的值不变来保持了堆栈平衡。

------解决方案--------------------------------------------------------
栈是平衡的,
只不过函数里面在引用栈上传送来变量是基于你设定的这个EBP的,所以EBP不对,就引不用到正确的变量了
------解决方案--------------------------------------------------------
探讨
[size=16px]上面写错了,纠正一下[/size]
(1)你为什么要:
push ebp
mov ebp,esp
sub esp,4
(2)你为什么又要改成
push ebp
sub esp,4
move ebp,esp
(3)谁说的不能用第2种?完全可以用!!!问题的核心是:你用了第(2)方法进来以后,你接下来的程序是不是跟着变了?最根子的东西,你是不是完全懂了用堆栈传递参数的方法,如果你看……
  相关解决方案