环境: VS2017
int sum(int a,int b)
{
return a+b;
}
int main()
{
int a = 10;
int b = 1;
int c = 0;
c = sum(a,b);
return 0;
}
{ (完成以下指令)
1, push ebp
2, mov esp,ebp
3, sub 开辟一块内存
4, push 压入各种寄存器
5, rep stos 初始化这片内存(VS 初始化为0CCCCCCCh)
int a = 10;
6, mov dword ptr[a],0Ah 把0Ah放在a所在地址,VC++ 中是ebp-4是a 所在地址
int b = 1;
7, mov dword ptr[b],1
int c = 0;
8, mov dword ptr[ret_1],0
ret_1 = sum(a,b);
9, mov eax,dword ptr[b] 把b赋给eax, (把sum()中的形参变量入栈,注意,是从右往左入)
10,push eax (栈顶入栈)
11, mov ecx,dword ptr[a]
12, push ecx
13, call sum(0AA1082h) call指令完成两件事,1,把下一行指令 (add esp,8)的地址入栈,2,执行跳转,跳转到sum所在的地方
14, {(sum 的同main的一样完成1,2,3,4,5步)
return a+b;
15 , mov eax,dword ptr[a]
16, add eax,dword ptr[b] 把b + eax
}
17,出栈之前压入寄存器
18,add esp,0Ch 回退形参变量内存(释放 形参所开辟的内存)
19,mov esp,ebp
20, pop ebp
21 ret 出栈,把栈顶里的地址(下一行指令地址)赋给pc
22,CPU 执行pc ,也就刚好是下一行指令的地址,也就回到了调用sum之后的位置
23 add esp,8
24 mov dword ptr[ret_1] eax
return 0;
25 xor eax,eax
}执行 17,18,19,20,21
到此main函数执行结束,回到调用main函数的地方
自己画个图会好一点,有什么问题欢迎指正。
版权声明:本文为Wqh_lrr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。