У меня вопрос о филиалах.
Существует два способа объявить такую таблицу:
- в секторе данных (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?
привет судьба