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