2017-03-16 46 views
0

我正在讀一本關於彙編語句的書,當輸入n是case時,代碼有case/branches:100,102,103,104,106。它通過用100減去n來簡化跳轉表,如果結果大於6,則轉到L2中的默認情況,否則它將轉到與%eax中的值匹配的相應分支。程序集:swtich語句

而我的問題是:如果是這樣,如果跳轉表的索引保存在%eax中,不是第7行假設是「jpm * .L7(,%eax)」?爲什麼他們通過做「ja.L2」將這個數字改成了第5行?

INT X在的%ebp + 8,INTñ在爲%ebp + 12

movl 8(%ebp), %edx 
movl 12(%ebp), %eax 
subl $100, %eax 
cmpl $6, %eax 
ja .L2 
jmp *.L7(,%eax,4) 
.L2: 
movl $0, %eax 
jmp .L8 
.L5: 
movl %edx, %eax 
jmp .L9 
.L3: 
leal (%edx,%edx,2), %eax 
leal (%edx,%eax,4), %eax 
jmp .L8 
.L4: 
leal 10(%edx), %eax 
.L9: 
addl $11, %eax 
jmp .L8 
.L6: 
movl %edx, %eax 
imull %edx, %eax 
.L8: 

謝謝!

跳錶:

.section .rodata 
.align 4 Align  
.L7: 
.long .L3   //Case 100: loc_A 
.long .L2   //Case 101: loc_def 
.long .L4   //Case 102: loc_B 
.long .L5  //Case 103: loc_C 
.long .L6  //Case 104: loc_D 
.long .L2  //Case 105: loc_def 
.long .L6  //Case 106: loc_D 

回答

2

不是假設是jpm *.L7(,%eax)如果跳錶的索引%eax召開第7行?

跳轉表中的每個條目是long,它是4個字節。因此eax由4

比例?爲什麼他們這樣做ja .L2改變成數第5行unsign?

關鍵是要排除任何號碼,不要小於100和大於106.我想這是很明顯它是如何排除值大於106
所以我們說n小於100,例如99.如果我們從中減去100,我們得到-1,當它看作一個無符號的32位值時,它是4294967295,顯然是「6」以上,並且跳到.L2是應該的。

subl $100, %eax ; eax = 99-100 == -1 
cmpl $6, %eax  ; set flags based on -1 - 6 == -7 => ZF=0 and CF=0 
ja .L2   ; jump if ZF=0 and CF=0 
+0

是因爲當我們改變符號整數無符號整數,無符號整數的價值,肯定是因爲有符號整數使用兩個補簽名的同時不改變一些大多少? – woshidashen

+0

好吧,沒有任何實際的「變化」跡象發生。有條件的跳轉是基於某些標誌的狀態。在ja中,如果ZF = 0且CF = 0,則跳轉。更新標誌的最後一個操作是'cmp',這實際上是一個減法。對於導致ZF = 0的減法意味着操作數不相等,並且要獲得CF = 0,第一個操作數('eax')需要無符號大於或等於第二個操作數('6')。因此,我建議將'eax'的值視爲未簽名,以便更容易推斷將發生的情況。 – Michael