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(两个参数 八个字节)直接出栈