c.cpp
int g_x=3 /* 因为g_x是全局变量所以编译的时候,它已经被编译到了 数据段中 故:代码段没有它 */
int fun_add(int p1,int p2){
returnp1+p2;
}
int main(){
intl_x=4;
g_x= fun_add(l_x,2);
return0:
}
编译之后的汇编代码如下
代码段
int fun_add(int p1,int p2){
00411250 55 push ebp
00411251 8B EC mov ebp,esp
00411253 83 EC 40 sub esp,40h
00411256 53 push ebx
00411257 56 push esi
00411258 57 push edi
return p1+p2;
00411259 8B 45 08 mov eax,dword ptr [p1]
0041125C 03 45 0C add eax,dword ptr [p2]
}
…………………………………..
int main(){
00411270 55 push ebp
00411271 8B EC mov ebp,esp
00411273 83 EC 44 sub esp,44h
00411276 53 push ebx
00411277 56 push esi
00411278 57 push edi
int l_x=4;
00411279 C7 45 FC 04 00 00 00 mov dword ptr [l_x],4
g_x =fun_add(l_x,2);
00411280 6A 02 push 2
00411282 8B 45 FC mov eax,dword ptr [l_x]
00411285 50 push eax
00411286 E8 93 FD FF FF call fun_add (41101Eh)
0041128B 83 C4 08 add esp,8
0041128E A3 00 60 41 00 mov dword ptr [g_x (416000h)],eax
return 0;
00411293 33 C0 xor eax,eax
}
00411295 5F pop edi
00411296 5E pop esi
00411297 5B pop ebx
00411298 8B E5 mov esp,ebp
0041129A 5D pop ebp
0041129B C3
C语言函数调ESP EBP的含义
ESP是当前函数执行到了哪里? EBP保存的是当前函数的栈底。 EBP指针的内容是 父函数的栈底。 ESP如果要调用子函数,先要做好准备工作。
保存父函数状态 保存调用函数 参数副本 保存退栈指令的地址(子函数执行完成后的下一条指令) 保存父函数栈底 |