c.cpp
int g_x=3
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如果要調用子函數,先要做好準備工作。 儲存父函數狀态 儲存調用函數 參數副本 儲存退棧指令的位址(子函數執行完成後的下一條指令) 儲存父函數棧底 |