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

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

switch語句 新的 移位 rap mage 中一 產生 可能 整數和

數據傳送指令:

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時,控制和數據信息添加到棧尾。

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