关于ebp esp有的一点小疑问

Nynia 2012-05-21 10:27:24
子程序开头是这样的
push ebp
move ebp,esp
sub esp,4
这样运行时没有问题,但我改成
push ebp
sub esp,4
move ebp,esp
仅仅是掉个顺序,就会有问题
这是为什么呢
...全文
204 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nynia 2012-05-25
  • 打赏
  • 举报
回复
感谢各位大神,我基本是明白了
就是说我这样用,虽然不符合习惯,但本身没什么大问题,只要我明白ebp究竟指的是哪,能正确引用指针就行。
Lactoferrin 2012-05-25
  • 打赏
  • 举报
回复
push ebp
mov ebp,esp
sub esp,4
leave

push ebp
sub esp,4
mov ebp,esp
leave
分别运行这两个,然后看看寄存器的值是什么
gsy999 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
上面写错了,纠正一下
(1)你为什么要:
push ebp
mov ebp,esp
sub esp,4
(2)你为什么又要改成
push ebp
sub esp,4
move ebp,esp
(3)谁说的不能用第2种?完全可以用!!!问题的核心是:你用了第(2)方法进来以后,你接下来的程序是不是跟着变了?最根子的东西,你是不是完全懂了用堆栈传递参数的方法,如果你看……
[/Quote]
gsy999 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
(1)你为什么要:
push ebp
mov ebp,esp
sub esp,4
(2)你为什么又要改成
push ebp
mov ebp,esp
sub esp,4
(3)
谁说的不能用第2种?完全可以用!!!问题的核心是:你用了第(2)方法进来以后,你接下来的程序是不是跟着变了?最根子的东西,你是不是完全懂了用堆栈传递参数的方法,如果你看不出第(2)与第(1)有什么不同,说了也白搭。



fortitan 2012-05-24
  • 打赏
  • 举报
回复
栈是平衡的,
只不过函数里面在引用栈上传送来变量是基于你设定的这个EBP的,所以EBP不对,就引不用到正确的变量了
shayla 2012-05-24
  • 打赏
  • 举报
回复
ret 时,esp会加4是为了pop进入函数时压入的eip。
jack_jk 2012-05-23
  • 打赏
  • 举报
回复
这里用到了ebp,因为我们无法用esp做指针,因为esp随时可能变化的,所以用ebp做指针。代码:
push ebp ;将ebp的值入栈
move ebp,esp ;把esp的值给ebp,让ebp当做指针
sub esp,4 ;这里就改变了esp,esp-4就是将栈顶指针向上移动,预留出空间来给局部变量
所以,你先修改了esp,然后又把值付给ebp做指针当然是错误了。
这里push和pop是会不对称出现的,因为就用ebp的值不变来保持了堆栈平衡。
Nynia 2012-05-23
  • 打赏
  • 举报
回复
ebp 不就是一个指针么,指向esp或者esp-4有什么区别呢,只要我用的时候知道真正指的哪不就行了[Quote=引用 6 楼 的回复:]

这里用到了ebp,因为我们无法用esp做指针,因为esp随时可能变化的,所以用ebp做指针。代码:
push ebp ;将ebp的值入栈
move ebp,esp ;把esp的值给ebp,让ebp当做指针
sub esp,4 ;这里就改变了esp,esp-4就是将栈顶指针向上移动,预留出空间来给局部变量
所以,你先修改了esp,然后又把值付给ebp做……
[/Quote]
zara 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]现在堆栈应该是平衡的吧,因为我程序末是有 leave 的,不是相当于 add esp ,4 pop ebp么[/Quote]
太高看 leave 的智能程度了吧。它的功能只是 mov esp, ebp 然后 pop ebp 并没有去分析你在子程开始处对 esp 进行了什么样的特殊处理而再相应的进行平衡的。还是在 ret 指令上设个断点看看 esp 的内容和指向处的内容吧,与进入子程时的比较下。空说是没有太大的意义的。
Nynia 2012-05-21
  • 打赏
  • 举报
回复
ebp 的值难道不能变么,我最后不是pop ebp了么[Quote=引用 3 楼 的回复:]

顺序改了之后 EBP的值不是变了么
[/Quote]
Himajesty 2012-05-21
  • 打赏
  • 举报
回复
顺序改了之后 EBP的值不是变了么
Nynia 2012-05-21
  • 打赏
  • 举报
回复
现在堆栈应该是平衡的吧,因为我程序末是有 leave 的,不是相当于 add esp ,4 pop ebp么
[Quote=引用 1 楼 的回复:]

看到子程的末尾的
mov esp, ebp
pop ebp
ret
了没?这里也要对应着改啊,不然你 sub esp, 4 不就堆栈不平衡了么。还不明白的话,在子程开始时记下来 esp 的内容,再在子程最后那里比较下。
[/Quote]
zara 2012-05-21
  • 打赏
  • 举报
回复
看到子程的末尾的
mov esp, ebp
pop ebp
ret

了没?这里也要对应着改啊,不然你 sub esp, 4 不就堆栈不平衡了么。还不明白的话,在子程开始时记下来 esp 的内容,再在子程最后那里比较下。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧