函数调用过程(反汇编分析)

本文深入解析函数调用过程,包括实参压栈、call函数名、进入函数、执行操作、返回值处理及堆栈清理等关键步骤。

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

1:

将函数的实参压栈(值传递是将值压榨,引用传递是将其偏移量,即有效地址压栈---对应于内存的分段管理模式)

 

2.call 函数名

这一步具体的操作就是将当前执行指令的地址压栈,为了函数结束后能够还原现场,(如果是near call,就将函数调用时的指令偏移量压栈,然后再将被调用函数的入口

地址的偏移量送入指令指针寄存器ip,即实现了程序的转移;如果是远调用,压栈时多压入该指令下的段寄存器cs的值,再将入口程序的偏移地址和段地址送入ip和cs)

 

3.进入函数

进入函数后先保护ebp将其压栈(在多层次递归调用中,ebp可能表示上一层次执行时的堆栈栈顶),然后mov ebp,esp 此时ebp指向栈顶,后面访问栈中的数据

都是通过ebp(寄存器相对寻址方式)来访问的,此时[ebp+n]是访问实参,[ebp-n]是访问函数内的局部变量。

然后就是通过esp-n的操作来预留一定的内存空间交给局部变量使用,然后就是将ebx,esi,edi保护起来,因为函数中可能会使用这三个寄存器,然后再将刚刚分配的

空间初始化(0CCCCCCCCH,一个字节cc对应汉字“烫”)

 

4.执行函数内部操作(如果传入的实参是地址值,则需要经过两次操作才能存取其值,一次通过ebp相对寻址获得去传递的值---地址值,再通过直接寻址方式存取其值)

 

5.函数调用结束(如果有返回值,通过eax寄存器传递)

函数调用结束时,先将最顶层的ebx,esi,edi还原--出栈,再将ebp的值给esp--恢复调用前堆栈的第一步即释放了局部变量,ret指令,通过将此时在栈顶的地址出栈还原出现场-----改变指令指针寄存器ip和cs段寄存器的值。

 

6.最后一步调节平衡--这是调节堆栈平衡的第二步

add  esp,N

消除调用函数时时产生的参数数据。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值