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?
它的偏移量为0:
eb 00
Run Code Online (Sandbox Code Playgroud)
然而,习惯上在汇编中抽象出这样的编码细节(因此反汇编输出),并且表示相对于指令开始($+2或例如)或绝对(如在jmp 6 <label>)中的偏移的相对跳跃.