汇编之EBP的认识。

本文解析了EBP与ESP寄存器在函数调用过程中的作用及其实现细节,通过具体示例代码说明了如何利用这两个寄存器进行参数传递和局部变量的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  说到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-04]   ;  把堆栈借(用负数)一个位置,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-04],ecx   ; 堆栈中借一个位置来存放ecx.
mov  eax,[ebp+08]   ; 从堆栈中取值, 上面一个函数,存入的参数参数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://www.cnblogs.com/Supperlitt/p/6394532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值