为什么AT&T jmp * bar用SIB字节组装成机器代码?指令中没有使用寄存器

lis*_*reg 2 assembly x86-64 gnu-assembler att

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

ff 24 25 30 10 60 00

产生于:

jmp *bar

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

第二个应该是Mod R / M字段。因此它翻译为:

00 100 100

含义:

00 -没有位移的内存(但是它具有恒定的地址,这不是“位移”吗?)

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

100-?? SIB?但是该指令中没有使用寄存器


PS一些上下文:

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) 
Run Code Online (Sandbox Code Playgroud)

fuz*_*fuz 5

操作数字节24 25表示具有32位位移的绝对寻址模式,即没有基址寄存器也没有索引寄存器。在64位模式下,这与相对寻址模式不同,相对寻址模式以modr / m字节表示25(但在32位模式下则不是)。如果要使用后一种寻址模式,请jmp *bar(%rip)使用AT&T语法编写。