函數調用
函數調用 |
函數調用,計算機編譯或運行時,使用某個函數來完成相關命令。對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變量或其它構造類型數據及表達式。各實參之間用逗號分隔。
目錄
簡介
在程序中通過對函數的調用來執行函數體,其過程與其它語言的子程序調用相似。
C語言中,函數調用的一般形式為:
函數名(實際參數表)
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變量或其它構造類型數據及表達式。各實參之間用逗號分隔。
用戶空間 操作系統的進程空間可分為用戶空間和內核空間,它們需要不同的執行權限。其中函數調用運行在用戶空間。
評價
指針寄存器 EBP
EBP是所謂的幀指針,指向當前活動記錄的上方(上一個活動記錄的最下方)
ESP
ESP是所謂的棧指針,指向當前活動記錄的最下方(下一個將要插入的活動記錄的最上方)
這兩個指針的值規定了當前活動記錄的位置
參數傳遞 將函數參數壓棧:mov eax,dword ptr [n] ;(n為參數變元)
push eax
操作 函數調用將執行如下操作:
⒈將幀指針壓入棧中:push ebp
⒉使得幀指針等於棧指針:mov ebp,esp
⒊使棧指針自減,自減得到的內存地址應當能夠(足夠)用來存儲被調用函數的本地狀態:sub esp,0CCh
注意:0CCh為0xCC,隨着具體函數的不同而不同。
傳入保存狀態 push ebx ;保存ebx寄存器的值
push esi ;保存esi寄存器的值
push edi ;保存edi寄存器的值
裝入edi lea edi,[ebp-0CCh] ;0cch是當前活動記錄的大小。
EDI是目的變址寄存器。
恢復傳入的保存狀態 00411417 pop edi
00411418 pop esi
pop ebx
棧指針上移,恢復空間 add esp,0CCh
函數返回釋放空間 當函數返回時,編譯器和硬件將執行如下操作:
⒈使棧指針等於幀指針: mov esp,ebp
⒉從棧中將舊的幀指針彈出: pop ebp
⒊返回:ret[1]