開啟主選單

求真百科

函數調用

來自 網絡 的圖片

函數調用,計算機編譯或運行時,使用某個函數來完成相關命令。對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變量或其它構造類型數據及表達式。各實參之間用逗號分隔。


目錄

簡介

程序中通過對函數的調用來執行函數體,其過程與其它語言的子程序調用相似。

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]

參考文獻