x86汇编-编码相对的jmp

时间:2019-02-17 05:13:30

标签: assembly x86 disassembly objdump radare2

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

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

    return 0;
}

构建此(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
   ...

rasm2 -d eb00显示jmp 2,这意味着跳转的偏移量为2。现在,我已经了解到,相对跳转的偏移量已添加到eip的当前值中,它应该指向下一条指令(即nop)。这种编码使我认为偏移量是相对于jmp自身地址的。由于jmp已经在jmp 0上,nop是否应该编码为label

1 个答案:

答案 0 :(得分:5)

它的编码偏移量为0:

eb 00

但是习惯上在汇编中(例如反汇编程序输出)从编码细节中抽象出来,并表示相对跳转,其相对于指令开始处的偏移量(例如$+2)或绝对地(如{ {1}}。