彙編控制類指令 switch之跳轉表

2021-06-22 18:01:57 字數 879 閱讀 3693

switch語句可以根據乙個整數索引值進行多重分支。處理具有多種可能結果的測試時,這種語句特別有用。它們不僅提高了**的可讀性,而且使用跳轉表這個資料結構使用實現更加高效。跳轉表是乙個陣列,表項i是乙個**段的位址,這個**段實現當switch索引值等於i時程式應該執行的動作。程式**用於索引值來執行乙個跳轉表內的陣列引用,確定跳轉指令的目標。和使用一組很長的

if-else相比,使用跳轉表的優點是執行switch語句的時間與switch的case數量無關。gcc根據switch語句中case的數量和case中值的稀少程式來翻譯開關語句。當case資料比較多(例如4個以上),並且值的範圍跨度比較小時,就會使用跳轉表。

1. 編寫switch.c程式如下:

int func(int x)

return ret;

}    2. 編譯為匯程式設計序

unix> gcc -s switch.c

3.檢視匯程式設計序switch.s主要內容如下:

初步分析,x值儲存在8(%ebp)位置,ret值儲存在-4(%ebp)中。圖中,.l7位置申請了一系列儲存用於儲存.l2~.l6的資訊,每個元素為long型,占用4位元組的空間(注意.l2處的**是default的內容)。假如把.l7看成是乙個資料,根據跳轉表的原理,我們分析,若x處於1~4之間,只需執行.l7[x]處的程式即可,即跳轉位址為.l7+4*x。

按照上面思路,我們忽略程式過程呼叫的一些壓棧操作和分配記憶體等操作從第15行看。第15、16行**作用是比較x與5的大小,如果5彙編控制類指令(2)—— 跳轉指令).

通過上面例子,我們知道c語言把跳轉表宣告為乙個多元素的陣列,第個元素都是乙個指向**的指標。跳轉表對於重複情況處理就是簡單地對重複項填入相同的標號(case 4、5),而對於缺失情況填入default的標號(switch內容為3時)。

組合語言 控制轉移類指令

1 無條件轉移指令 根據轉移的距離,jmp指令可分為兩類 段內轉移和段間轉移 段內轉移是在同一 段內進行,又稱近轉移,只要修改ip的值即可實現 段間轉移可以在不同 之間進行,又稱遠轉移,需要同時修改cs和ip的值。直接轉移是指轉移的目標位址直接出現在指令中,在程式執行前就已經確定 間接轉移是指轉移的...

Java控制執行語句之Switch

switch可以劃分為一種選擇語句,根據整數表示式的值,switch語句可以從一系列 選出一段去執行,其格式如下 switch selector case integral value1 statement break case integral value1 statement break cas...

彙編(十) 算術運算類指令

算術運算類指令用來執行二進位制及十進位制的算術運算 加減乘除。這類指令會根據運算結果影響狀態標誌,有時要利用某些標誌才能得到正確的結果。一 加法指令 1 加法指令add add reg,imm reg mem reg reg imm reg mem add mem,imm reg mem mem i...