x86 64彙編呼叫過程簡介

2021-09-29 02:33:24 字數 1140 閱讀 8192

過程是軟體中一種很重要的抽象。

它提供了一種封裝**的方式,用一組指定的引數和乙個可選的返回值實現了某種功能。

設計良好的軟體用過程作為抽象機制,隱藏某個行為的具體實現,同時又提供清晰簡潔的介面定義,說明要計算的是哪些值,過程會對程式狀態產生什麼樣的影響。

不同程式語言中,過程的形式多樣:函式,方法,子例程,處理函式等。

假設過程p呼叫過程q,q執行後返回到p。過程的實現需要使用下面三個機制。

轉移控制:轉移控制是通過call指令以及ret指令來實現的。

call指令會把位址a壓入棧中,並將pc設定為q的起始位址。壓入棧中的位址a被稱為返回位址,是緊跟在call指令後面的那條指令的位址。

ret指令會從棧中彈出位址a,並把pc設定為a。

傳遞資料:資料可以通過暫存器和棧來傳遞。

x86_64中,可以通過暫存器最多傳遞6個整形引數。按照引數的順序分別為暫存器%rdi,%rsi,%rdx,%rcx,%r8,%r9。

如果乙個函式有大於6個整形引數,超出6個的部分就要通過棧來傳遞。通過棧傳遞引數時,所有的資料大小都向8的倍數對齊。

分配和釋放記憶體:區域性儲存分為棧上的區域性儲存以及暫存器中的區域性儲存。

棧上的區域性儲存:

有些時候區域性資料必須存放在記憶體中,常見的情況包括:

暫存器中的區域性儲存:

暫存器組是唯一被所有過程共享的資源。雖然在給定時刻只有乙個過程是活動的,我們仍然必須確保當乙個過程(呼叫者)呼叫另乙個過程(被呼叫)時,被呼叫者不會覆蓋呼叫者稍後會使用的暫存器值。

為此,x86_64採用了一組統一的暫存器使用慣例,所有的過程都必須遵循。

根據慣例,暫存器%rbx,%rbp和%r12~%r15被劃分為呼叫者儲存暫存器。

當過程p呼叫過程q時,q必須儲存這些暫存器的值,保證它們的值在q返回到p時與q被呼叫時是一樣的。

過程q儲存乙個暫存器的值不變,要麼就是根本不去改變它,要麼就是把原始值壓入棧中,改變暫存器的值,然後在返回前從棧中彈出舊值。壓入暫存器的值會在棧幀中建立標號為儲存的暫存器的一部分。

所有其他的暫存器,除了棧指標%rsp,都被分類為呼叫者儲存暫存器。這就意味著任何函式都能修改它們。可以這樣來理解呼叫者儲存這個名字:過程p在某個此類暫存器中有區域性資料,然後呼叫過程q。因為q可以隨意修改這個暫存器,所有在呼叫之前首先儲存好這個資料是p(呼叫者)的責任。

x86 64彙編 控制

跳轉指令 條件分支 迴圈switch語句 總結自 深入理解計算機系統 第三版 cpu還維護一組單個位的條件碼暫存器,用來描述最近的算術和邏輯操作的屬性。常用 cf 無符號溢位 of 有符號溢位 zf 零標誌 sf 符號標誌 注意 test指令與and指令一樣,而不改變dest暫存器 用法 兩個運算元...

linux 啟動 過程 學習 (x86 64

1.arch x86 boot header.s kernel setup 從 start開始。設定 stack,bss,最後跳轉到 arch x86 boot main.c。2.在main函式中,把kernel setup header 拷貝到 struct setup header,之後初con...

彙編看函式呼叫過程

分析下列原始碼 include dword stdcall function dword dwp1,pvoid p2 int main 轉彙編 vs2012 include dword stdcall function dword dwp1,pvoid p2 00fe1401 pop edi edi...