子程序开头是这样的
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不对,就引不用到正确的变量了
------解决方案--------------------------------------------------------