gpt4 book ai didi

assembly - 为什么 AT&T jmp *bar 汇编为带有 SIB 字节的机器代码?指令中没有使用寄存器

转载 作者:行者123 更新时间:2023-12-02 22:14:35 26 4
gpt4 key购买 nike

我在 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?但该指令中没有使用寄存器


附注一些背景:

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)

最佳答案

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

关于assembly - 为什么 AT&T jmp *bar 汇编为带有 SIB 字节的机器代码?指令中没有使用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55088448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com