x86程序集 - 编码相对jmp

Mar*_*tin 1 x86 assembly objdump disassembly radare2

我对gcc如何编码相对跳跃感到有点困惑.我有以下内容:

int main(void)
{
    __asm__ __volatile__(
        "jmp label\n"
        "label:\n"
        "nop\n"
    );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

构建this(gcc -c -o test.o test.c)显示以下(objdump -M intel -d test.o):

0000000000000000 <main>:
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
   4:   eb 00                   jmp    6 <label>

0000000000000006 <label>:
   6:   90                      nop
   ...
Run Code Online (Sandbox Code Playgroud)

rasm2 -d eb00显示jmp 2,这意味着正在以2的偏移量执行跳转.现在,我已经理解相对跳跃的偏移量被添加到当前值eip,该值应该指向下一条指令(即nop).这种编码让我觉得偏移是相对于jmp自身的地址.不应该jmp被编码为jmp 0,因为nop已经在label

har*_*old 5

它的偏移量为0:

eb 00
Run Code Online (Sandbox Code Playgroud)

然而,习惯上在汇编中抽象出这样的编码细节(因此反汇编输出),并且表示相对于指令开始($+2或例如)或绝对(如在jmp 6 <label>)中的偏移的相对跳跃.

  • @martin 通常反汇编程序显示跳转指令操作数的目标的绝对地址。我希望“rasm2”能够像“objdump”一样显示“jmp 6”。不管出于什么原因,“rasm2”可能认为 JMP 指令位于地址 0。 (2认同)