2

我对 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

4

1 回答 1

7

它使用偏移量 0 进行编码:

eb 00

然而,习惯上从汇编中的这些编码细节(因此反汇编器输出)中抽象出来,并用相对于指令开头的偏移量表示相对跳转(例如$+2)或绝对跳转(如jmp 6 <label>)。

于 2019-02-17T05:17:50.080 回答