第三章 機器的程序級表示(中)
數據傳送指令:
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時,控制和數據信息添加到棧尾。
第三章 機器的程序級表示(中)