为什么 AT&T jmp *bar assemble 到带有 SIB 字节的机器码?指令中没有使用寄存器

Why does AT&T jmp *bar assemble to machine code with a SIB byte? There's no register used in the instruction

我在 x86 机器上有这个绝对间接跳转指令:

ff 24 25 30 10 60 00

生成自:

jmp *bar

但是我在解码它的第二个和第三个字节时遇到了问题。

第二个应该是 Mod R/M 字段。所以它转化为:

00 100 100

意思是:

00 - 没有位移的内存(但它有常量地址,这不是"displacement"吗?)

100(12 月 4 日)- 扩展操作。代码 (FF/4 => JMP r/m32)

100 - ??同业银行?但是这条指令没有用到寄存器


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   [=11=]x40052f,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) 

操作数字节24 25表示绝对寻址方式,位移32位,即无基址寄存器和变址寄存器。在 64 位模式下,这与由 modr/m 字节 25 指示的 32 位位移的相对寻址模式不同(但在 32 位模式下则不然)。如果你想要后一种寻址方式,用AT&T语法写jmp *bar(%rip)