#include <iostream>
using namespace std;
int func(int a,int b);
void main()
{
intx = 1;
inty = 2;
intz = func(x,y);
}
int func(int a,int b)
{
returna + b;
}
汇编解析:
void main()
{
//这个函数头产生的汇编代码是:
main:
013E13A0 push ebp
013E13A1 mov ebp,esp
013E13A3 sub esp,0E4h
013E13A9 push ebx
013E13AA push esi
013E13AB push edi
013E13AC lea edi,[ebp-0E4h]
013E13B2 mov ecx,39h
013E13B7 mov eax,0CCCCCCCCh
013E13BC rep stos dword ptres:[edi]
*******************************************************
intx = 1;
inty = 2;
//这个的汇编代码是:
013E13BE mov dword ptr [x],1
013E13C5 mov dword ptr [y],2
*******************************************************
//接下来就是函数的调用了,先是把参数压栈
013E13CC mov eax,dword ptr [y]
013E13CF push eax
013E13D0 mov ecx,dword ptr [x]
013E13D3 push ecx
//参数压栈后就是调用函数
013E13D4 call func (13E11D1h)
// 在这个地方用F11调试步进,可以进入子函数func的汇编代码,如下:
013E11D1 jmp func (13E35B0h)
func:
013E35B0 push ebp
013E35B1 mov ebp,esp
013E35B3 sub esp,0C0h
013E35B9 push ebx
013E35BA push esi
013E35BB push edi
013E35BC lea edi,[ebp-0C0h]
013E35C2 mov ecx,30h
013E35C7 mov eax,0CCCCCCCCh
013E35CC rep stos dword ptr es:[edi]
013E35CE mov eax,dword ptr [a]
013E35D1 add eax,dword ptr [b]
013E35D4 pop edi
013E35D5 pop esi
013E35D6 pop ebx
013E35D7 mov esp,ebp
013E35D9 pop ebp
013E35DA ret
//func函数执行完毕后返回主函数中
013E13D9 add esp,8
013E13DC mov dword ptr [z],eax
013E13DF xor eax,eax
013E13E1 pop edi
013E13E2 pop esi
013E13E3 pop ebx
013E13E4 add esp,0E4h
013E13EA cmp ebp,esp
013E13EC call @ILT+315(__RTC_CheckEsp) (13E1140h)
013E13F1 mov esp,ebp
013E13F3 pop ebp
013E13F4 ret
接下来再看看各个寄存器都是怎么变的,里面存的什么东西
1 首先进入main函数最开始:
再看看此时的寄存器的内容:
EAX = 00851D88EBX = 7E0BC000 ECX = 00854A30 EDX = 00000001ESI = 00000000 EDI = 00000000 EIP = 013E13A0ESP = 009BF76C EBP = 009BF