程式的機器級表示二(控制)

2021-10-07 01:51:52 字數 1942 閱讀 8130

目錄

1.條件碼

2.跳轉指令

3.條件傳送指令

4.switch語句

實現有條件的行為:

lea/mov指令不設定條件碼

比較和測試指令:

cmp類似 

sub 指令的行為,只設定條件碼而不更新目標暫存器。

test類似and,只設定條件碼而不更新目標暫存器。

訪問條件碼:

用法:①條件碼組合,設定某個位元組 ②條件跳轉 ③條件傳送

set暫存器單位元組,要清零暫存器高位位元組。

跳轉的目的地用標號之名,產生目標檔案時,彙編器確定帶標號指令的位址,將跳轉目標的編碼為指令一部分

eg:第1行 jle 執行時,eip=0xa,目標dest2=0x17  編碼=dest2-eip=0xd

第7行 jg 執行時, eip=0x17,目標dest1=0xa 編碼=dest1-eip=-13=0xf3

分支**懲罰:

處理器通過使用流水線

(pipelining) 來獲得高效能,

通過重疊連續指令的步驟來獲得高效能。

當機器遇到條件跳轉(也稱為「分支")時,它常常還不能夠確定是否會 進行跳轉。處理器採用非常精密的分支**邏輯試圖猜測每條跳轉指令是否會執行。

只要它的 猜測還比較可靠(現代微處理器設計試圖達到 90%

以上的成功率),指令流水線中就會充滿著指

令。另一方面,錯誤**乙個跳轉要求處理器丟掉它為該跳轉指令後所有指令已經做了的工作, 然後再開始用從正確位置處起始的指令去填充流水線。正如我們會看到的,這樣乙個錯誤**會招致很嚴重的懲罰。大約 20-40

個時鐘週期的浪費,導致程式效能的嚴重下降。

條件傳送:

與條件跳轉不同,處理器可以執行條件傳送,而無需**測試的結果。處理器只是讀源值(可能是從儲存器中),檢查條件碼,然後要麼更新目的暫存器,要麼保持不變。

不是所有的條件表示式都可以用條件傳送來編譯。可能出現非法引用,改變全域性變數等等:

只有當兩個表示式都很容易計算時,例如表示式分別都只是一條加法指令,它才使用條件傳送。

​​​​​​​當開關情況數量比較多(例如 4個以上),並且值的範圍跨度比較小時,就會使用跳轉表。

陣列 jt 包含7

個表項,每個都是乙個**塊的位址。

使用跳轉表是一種非常有效的實現多重分支的方法。當switch 語句有上百種情況的時候,也可以只用一次跳轉表訪問去處理。

程式的機器級表示(二)

以上操作,我們只考慮了直線 的行為,即指令按順序執行。但是還有一些 比如條件語句 迴圈語句和分支語句,要求有條件的執行,這時需要根據資料測試的結果來改變條件碼,結合跳轉指令決定操作執行的順序。條件傳送指令 實現條件操作的傳統方法是利用控制的條件轉移。當條件滿足時,程式沿著一條執行路徑進行,而當條件不...

程式的機器級表示

三種 立即數 常數值,在att格式的彙編 中,書寫格式是 整數,如 123 0x12 暫存器 如 32位的 eax 16位的 ax 8位的 al 儲存器引用 mov 同等傳送,即倆者的大小一致 如 movb byte,movew word,movel longword dw movs movz 不同...

程式的機器級表示

32位和64位 instruction system architecture 程式計數器pc eip 整數暫存器 8個每個32位 有的用來記錄狀態,有的用來儲存臨時資料,區域性變數,返回值 3.條件碼暫存器 指標都是雙字 char short long 其他4位元組 movb movw movl ...