函数调用详解

C语言中函数的传参是从右到左,依次压栈

main也是一个函数,与其他函数调用一样

在这里插入图片描述
1.push ebp将基址指针寄存器入栈,即主调函数的基址
2.mov ebp esp 将当前栈顶的值 赋给ebp 成为被调函数的ebp(记录被调函数的基址)
3.sub esp 48h留出48h大小的空间留给栈(局部变量 栈的缓冲空间 先给局部变量分配空间 都是全C 为什么都是全C呢?看第六步)
4.push ebx esi edi(将这三个寄存器的值压入栈中)
5.lea edi [ebp-48h] (将ebp-48h的值转化成地址赋给edi)
6.mov ecx 12h
mov eax 0ccccccch
rep stos dword ptr[edi]
rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址.
7 两个赋值 注意他们两个变量与ebp的关系
nNum1 是ebp-4 | nNUm2 是ebp-8
8函数压栈 注意是从右到左 先压ebp-8 然后压ebp-4
9执行call指令 保存主调函数的EIP(就是执行到哪条语句了),修改EIP为被调函数的入口,进行跳转
先压入参数 在压入EIP 注意下面Add函数中nNum1和nNum2与EBP关系 EIP也占四个字节
10 进入Add函数与这个过程一致 大家自己试着分析一下
11.Add函数返回时恢复现场
11.add esp 8(两个参数 八个字节)直接出栈

VC6.0中默认给的栈缓冲空间是40h 但是因为多了两个int变量 8个字节,所以是ebp-48h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值