Branchtables в Ассемблере (Nasm) - PullRequest
       8

Branchtables в Ассемблере (Nasm)

0 голосов
/ 14 февраля 2012

У меня вопрос о филиалах.

Существует два способа объявить такую ​​таблицу:

  1. в секторе данных (DS)
  2. в секторе кода (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?

привет судьба

1 Ответ

2 голосов
/ 15 февраля 2012

, какой метод более эффективен, зависит от процессора, с которым вы имеете дело, однако, я позволю себе не согласиться с вашим профом, использование CS требует переопределения префикса сегмента, что делает код больше, а значит, длиннее для обработки и менее дружественным к кешу,но на x86 Windows (пользовательский), CS и DS выравниваться в то же линейное адресном пространство, что делает его спорный вопрос оптимизации.

Некоторые процессоры (Intel Atom) также имеет более медленный доступ к CSкогда база сегмента отлична от нуля, хотя в x64 она исчезает, так как все сегменты, кроме FS и GS, игнорируются (их база - implicity 0) из-за модели плоской адресации x64.Следует также отметить, что Intel рекомендует использовать как можно меньше сегментных регистров (это облегчает нагрузку на переименователь регистров).

...