117 描述函式呼叫的現場保護和現場恢復

2021-10-13 00:08:49 字數 1985 閱讀 7160

首先進入主函式,系統為主函式開闢乙個棧幀,依次入棧 x=10(佔4位元組),y=20(佔4位元組),z=0(佔4位元組),執行到z=fun(x,y);呼叫子函式fun,開闢子函式fun的棧幀,先將y的值賦值給b,b=20入棧,然後將x的值賦值給a,a=10入棧,然後將主函式的棧底指標入棧,然後將主函式z=fun(x,y);後的指令位址也進行入棧,稱為現場保護。然後將a+b的值30賦值給c,將c=30入棧。子函式此時執行到return c; 系統將30這個值寄存到eax暫存器中,然後將eax暫存器的值30賦值給主函式的z。然後將z=fun(x,y);的指令位址和主函式的棧底指標恢復給主函式,稱為現場恢復,主函式執行printf("%d ",z); return 0;程式結束

push push src入棧指令 將源運算元src壓入堆疊

pop pop dest 出棧指令 從棧頂彈出資料到dest

mov mov dest,src 將資料從src移動到dest

add 加法指令 add dest,src 在dest基礎上加src

sub 減法指令 sub dest,src 在dest基礎上減src

inc 加1指令 dec減1指令 inc dest在dest基礎上加1 dec dest在dest基礎上減1

not 取反運算指令 not dest

and 與 or或 xor異或 and dest,src 把dest和src進行與運算後送回到dest or dest,src 把dest和src進行或運算之後送回到dest

loop 計數迴圈 是ecx的值減1,當ecx的值不為0的時候跳轉到label,否則執行loop之後的語句

call 過程呼叫指令 call label 直接呼叫label 將當前ip或cs和ip壓入棧中 轉到label處 不能實現短轉移

jmp 無條件轉移命令 jmp label 無條件地轉移到標號為label的位置

je 條件轉移指令 je label zf=1時跳轉到標號為label的位置

jne 條件轉移指令 je label zf=0時跳轉到標號為label的位置

[eax]暫存器間接定址 eax暫存器直接定址

ret 用棧中的資料修改ip(近轉移)

reft 用棧中的資料修改cs:ip(遠轉移)

lea 將儲存器運算元的4位16進製制偏移位址送到指定的暫存器。源運算元必須是儲存器運算元,目標運算元必須是16位通用暫存器。該暫存器常用來做位址指標。

rep stos stos串儲存指令 將exa中的資料傳送到目的位址(預設es:[edi]),

rep重複字首指令 每執行一次 ecx減1 直到ecx減至0.重複執行結束

rep stos dword ptr es;[edi]; 從低位址向高位址填充

0cccccccch 起到填充的作用 負責把前函式的空間進行清理

以上這一列位址都寄存在eip暫存器中

也是進行函式呼叫的現場保護和現場恢復

呼叫函式和被呼叫函式的關係

1 當在乙個函式的執行期間呼叫另乙個函式時,在執行被呼叫函式之前,系統需要完成三件事情 1 將所有的實參 返回位址等資訊傳遞給被呼叫函式儲存 2 為被呼叫函式的區域性變數分配儲存區 3 將控制轉移到被調函式的入口。2 從被呼叫函式返回到呼叫函式之前,系統要做三件事情 1 儲存被調函式的計算結果 2 ...

函式的引數和函式呼叫

1 函式的引數 在呼叫函式時,大多數情況下主調函式和被調函式之間存在著資料傳遞關係。於是就用到了形式引數和實際引數,簡稱形參和實參。在定義函式時函式名後面括號中的變數稱為 形參 在主調函式 一般為main 呼叫乙個函式時,函式名後面括號中的引數 可以是乙個表示式 稱為 實參 例如 void func...

系統呼叫和函式呼叫的區別

作業系統服務的程式設計介面 通常由高階語言編寫 c或c 程式訪問通常通過高層次 的api介面 c標準庫的庫函式 而不是直接進行系統呼叫 每個系統呼叫對應乙個系統呼叫編號 系統呼叫 1.使用int和iret指令,核心和應用程式使用的是不同的堆疊,因此存在堆疊的切換,從使用者態切換到核心態,從而可以使用...