第三章 機器的程式級表示(中)
資料傳送指令:
MOV指令:將資料從源位置複製到目的位置,不做任何變化;MOV指令由四條指令組成:movb、movw、movl、movq;它們的區別在於它們操作的資料大小不同,分別為1、2、4、8位元組;
壓入和彈出棧資料:
遵循“後進先出”原則,通過push操作將資料壓入棧中,通過pop操作刪除資料;彈出的值,永遠是最近被壓入而且仍然在棧中的值。其中,棧頂元素的地址是所有棧中元素地址最低的。將一個四字值壓入到棧中,首先要將棧指標減8,然後將值寫入到新的棧頂指標。因此,指令pushq %rbp的行為等價於:
sub $8,%rsp
movq %rbp,(%rsp)
彈出一個四字的操作包括從棧頂位置讀出資料,然後將棧指標加8。因此,指令popq %rax等價於下面兩條指令:
movq (%rap),%rax
addq &8,%rsp
算術和邏輯運算:
下圖列出了一些整數和邏輯操作。給出的每個指令類都有對這四種不同大小資料的指令。這些操作被分為四組:載入有效地址,一元操作,二元操作和移位;
載入有效地址leaq實際上是對movq指令的變形。它的指令形式是從記憶體讀資料到暫存器,但實際上它根本就沒有引用記憶體。
一元操作:只有一個運算元,既是源,又是目的。如,incq(%rsp)會使棧頂的8位元組元素加1。
二元操作:第二個運算元既是源,又是目的。如 subq %rax,%rdx,它表示暫存器%rdx的值減去%rax中的值。
控制:jump指令可以改變一組機器程式碼指令的執行順序;
條件碼:
CF:進位標誌;
ZF:零標誌;
SF:符號標誌;
OF:溢位標誌;
實現條件操作的傳統方法是,通過使用控制的條件轉移。當條件滿足時,程式沿著一條執行路徑執行,而當條件不滿足時,就走另一個條路徑。這種機制簡單通用,但是在處理器上它可能低效;
一種替代的策略實使用資料的條件轉移。這種方法計算一個條件操作的兩種結果,然後再根據條件是否滿足從中選取一個。
迴圈:彙編中是沒有相應的迴圈指令,但是可以用條件指令和跳轉組合起來實現迴圈的效果;
如:
對應:
switch語句:執行switch語句的關鍵步驟是通過跳轉表來訪問程式碼位置;
圖3-23則是編譯switch_eg時產生的彙編程式碼:
過程:
過程是軟體中一種很重要的抽象,過程的形式多樣:函式、方法、子例程、處理函式等等;
要提供對過程的機器級支援,必須要處理許多不同的屬性。假設過程P呼叫過程Q,Q執行後返回到P。這些動作包括下面一個或多個機制:
傳遞控制、傳遞資料、分配和釋放記憶體;
執行時棧:先進後出的記憶體管理原則。
以上,過程P在呼叫過程Q。當Q在執行時,P以及所有在向上追溯到P的呼叫鏈中的過程,都是暫時被掛起的。當Q執行時,它只需要為區域性變數分配新的儲存空間,或者設定到另一個過程的呼叫。另一方面,當Q返回時,任何它所分配的區域性儲存空間都可以被釋放。因此,程式可以用棧來管理它的過程所需要的儲存空間,棧和程式暫存器存放著傳遞控制的資料、分配記憶體所需要的資訊。當P呼叫Q時,控制和資料資訊新增到棧尾。