我对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
?
答案 0 :(得分:5)
它的编码偏移量为0:
eb 00
但是习惯上在汇编中(例如反汇编程序输出)从编码细节中抽象出来,并表示相对跳转,其相对于指令开始处的偏移量(例如$+2
)或绝对地(如{ {1}}。