我對分支表有疑問。彙編程序中的分支表(Nasm)
有兩種方法來聲明這樣一個表:
-
在數據扇區(DS)
- 在代碼區(CS)
請告訴我這種方法有什麼不同?
我已經學會了這下面的例子: 案例1:
SECTION .data
i dd 2;
stab dd m1,m2,m3 ; branchtable for switch
SECTION .text
global start
start:
mov ebx , [ i ] ; switch (i)
cmp ebx , 1 ;
jl end
cmp ebx , 3
jg end
shl ebx , 2 ; /∗ stab 4 Bytes ∗/
jmp [ stab+ebx −4];
m1: ;do something.....
....
案例2:
SECTION .data
i dd 2;
SECTION .text
global start
start:
mov ebx , [ i ] ; switch (i)
cmp ebx , 1 ;
jl end
cmp ebx , 3
jg end
shl ebx , 2 ; /∗ stab 4 Bytes ∗/
jmp [ cs : ebx+stab −4]; branchtable in codesegment
ALIGN 4 ;
stab dd m1,m2,m3
m1: ; do something
....
我們的教授告訴我們,該方法2是更有效實現了,但爲什麼?因爲對於分支機構來說只是短暫的跳躍,我們不需要在DS中展示?
格爾茨的命運
也許是因爲在第二種情況下,高速緩存可能已經預取了包含稱爲刺的表的內存位置? – 2012-02-14 19:12:36
和Peter一樣,我認爲它與緩存局部性有關,但我沒有任何硬性事實。不過,我可以說,我見過的所有編譯器生成的代碼(很多)都在代碼段中有跳轉表。 – 2012-02-14 19:28:18
啊沒關係,它更有效,因爲它執行'align'緩存刺的內容? – destiny 2012-02-14 19:31:15