Почему AT & T jmp * bar собирается в машинный код с байтом SIB?Там нет регистра, используемого в инструкции - PullRequest
2 голосов
/ 10 марта 2019

У меня есть команда абсолютного косвенного перехода на компьютере x86:

ff 24 25 30 10 60 00

который был сгенерирован из:

jmp *bar

но у меня проблемы с декодированием второго и третьего байта.

Вторым должно быть поле Mod R / M. Так что это означает:

00 100 100

значение:

00 - память без смещения (но имеет постоянный адрес, не так ли это смещение?)

100 (дек. 4) - расширенный op. код (FF / 4 => JMP r / m32)

100 - ?? SIB? но в этой инструкции регистр не используется


P.S. некоторый контекст:

Breakpoint 4, test () at test.s:13
13              jmp     *bar
(gdb) disassemble /r
Dump of assembler code for function test:
   0x000000000040051b <+0>:     c7 04 25 30 10 60 00 2f 05 40 00        movl   $0x40052f,0x601030
=> 0x0000000000400526 <+11>:    ff 24 25 30 10 60 00    jmpq   *0x601030
   0x000000000040052d <+18>:    87 c0   xchg   %eax,%eax
   0x000000000040052f <+20>:    c3      retq   
End of assembler dump.
(gdb) list
8               bar: .word 0x0
9       .text
10      test:
11      .LFB0:
12              movl    $label1, bar
13              jmp     *bar
14              xchg    %eax, %eax
15              label1:
16              ret
17      .LFE0:
(gdb) 

1 Ответ

5 голосов
/ 10 марта 2019

Операнды байтов 24 25 указывают на режим абсолютной адресации с 32-битным смещением, то есть без базового регистра и без индексного регистра.В 64-битном режиме это отличается от режима относительной адресации с 32-битным смещением, обозначенным байтом modr / m 25 (но в 32-битном режиме это не так).Если вы хотите последний режим адресации, напишите jmp *bar(%rip) в синтаксисе AT & T.

...