x86 程序集 - 编码相对 jmp
x86 assembly - Encoding a relative jmp
我对 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 执行跳转。现在,我明白了相对跳转的偏移量被添加到 [=16 的当前值=],它应该指向下一条指令(即 nop
)。这种编码让我认为偏移量是相对于 jmp
本身的地址的。 jmp
不应该编码为 jmp 0
,因为 nop
已经在 label
了吗?
它的编码偏移量为0:
eb 00
然而,习惯上从汇编中的此类编码细节(以及反汇编器输出)中抽象出来,并用相对于指令开头的偏移量(例如 $+2
)或绝对(如在 jmp 6 <label>
).
我对 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 执行跳转。现在,我明白了相对跳转的偏移量被添加到 [=16 的当前值=],它应该指向下一条指令(即 nop
)。这种编码让我认为偏移量是相对于 jmp
本身的地址的。 jmp
不应该编码为 jmp 0
,因为 nop
已经在 label
了吗?
它的编码偏移量为0:
eb 00
然而,习惯上从汇编中的此类编码细节(以及反汇编器输出)中抽象出来,并用相对于指令开头的偏移量(例如 $+2
)或绝对(如在 jmp 6 <label>
).