汇编之EBP的认识。

汇编之EBP的认识。,第1张

汇编之EBP的认识。


  说到EBP就不能忽略了ESP。


ESP是一个指针,始终执行堆栈的栈顶。


而EBP就是那个所谓的堆栈了。


先看几个例子吧。


push ebp        ; 把ebp,堆栈的0地址压入堆栈
mov ebp,esp      ; 把栈顶指针存入当前堆栈esp,也就是堆栈的esp位置。



push ecx        ; 存入 ecx 参数
push 00000002     ; 存入 2 参数
push 00000001     ; 存入 1 参数局
lea ecx,[ebp-]   ; 把堆栈借(用负数)一个位置,4字节长。


赋值给ecx,这个值是多半是上层传递下来的。



call 00401020     ; 调用指定地址的函数



mov esp,ebp
pop ebp
ret
.... 00401020处代码(理解成一个函数):
push ebp        ; 进入函数代码了,然后把存入进来的0地址ebp,保存到堆栈。



mov ebp,esp      ; esp保存到ebp里面,保存到
push ecx        ; 存入 ecx到堆栈中。



mov [ebp-],ecx   ; 堆栈中借一个位置来存放ecx.
mov eax,[ebp+]   ; 从堆栈中取值, 上面一个函数,存入的参数参数2
add eax,[ebp+0C] ; 从堆栈中取值,上面一个函数存入的参数1
mov esp,ebp ; 把 ebp首地址的值写回到 esp中。



pop ebp        ; 释放 ebp中的0地址到ebp中。



ret 0008       ; 释放掉 可能是释放掉一个call地址和其中在本次函数中push的一个值。


这样解释比较合理。


(就是使用ebp开辟的一个空间值)

  上面代码主要就是一个,传入参数调用函数进行一个1+2的计算。


先解释一下上面代码:

可以通过这个认识到几点。


1、如果使用了push ebp    mov  ebp,esp *** 作进行初始化。


  那么从堆栈中取值都是ebp+XXX值。




  而往堆栈里面,放入值都是[EBP-XXX],寄存器。


这样的 *** 作。


2、ebp应该就是针对当前函数,作用域独立存在的一个堆栈的首地址了。


  而ESP就是,执行当前栈顶的一个指针,这个作用域是跨越了所有函数调用的。










个人理解,没有配图,请大家参考其他文章相应理解,我仅仅作为个人理解记录。


想再想想,大学时候,鄙视别人看的书,现在自己也拾起来看了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/588159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存