1. 程式人生 > >第三章 機器的程式級表示(中)

第三章 機器的程式級表示(中)

資料傳送指令:

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時,控制和資料資訊新增到棧尾。