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如果要调用子函数,先要做好准备工作。
保存父函数状态 保存调用函数 参数副本 保存退栈指令的地址(子函数执行完成后的下一条指令) 保存父函数栈底 |