我使用了
objdump -M intel -d test
and
objdump -d test
使用gcc 686-elf交叉编译器反汇编一个非常简单的for循环,我在两种情况下都得到了以下结果:
d: eb 11 jmp 20 <loop+0x20>
完整的转储(INTEL)如下:
00000000 <loop>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 ec 10 sub esp,0x10
6: c7 45 fc 00 00 00 00 mov DWORD PTR [ebp-0x4],0x0
d: eb 11 jmp 20 <loop+0x20>
f: a1 00 00 00 00 mov eax,ds:0x0
14: 83 c0 01 add eax,0x1
17: a3 00 00 00 00 mov ds:0x0,eax
1c: 83 45 fc 01 add DWORD PTR [ebp-0x4],0x1
20: 83 7d fc 09 cmp DWORD PTR [ebp-0x4],0x9
24: 7e e9 jle f <loop+0xf>
26: 90 nop
27: c9 leave
28: c3 ret
如果它从标签为 loop 的位置(0)跳转到偏移量 20,则这是有意义的。
令我困惑的是语法。为什么有两个数字 20?
20 <loop+0x20>
jmp
是相对的,而不是绝对的。因此它是一个偏移量,而不是一个地址。 - Oliver Charlesworthjmp 20 <loop+0x20>
中,<loop+0x20>
是反汇编器提供的信息输出。在这种情况下,JMP
是相对于 JMP 指令本身的结尾。下一条指令位于 0xf,因此汇编器将相对跳转编码为从跳转结尾开始的 +0x11。0x11+0x0f = 0x20。您可以在操作码输出eb 11
中看到 11 的相对编码。 - Michael Petch<loop+0x20>
表示跳转的目标地址是从标签loop
(即当前函数的开头)开始的0x20字节(32十进制)。很容易看出,从loop的开头算起的0x20是20: 83 7d fc 09 cmp DWORD PTR [ebp-0x4],0x9
(请注意开头的20:)。 - Michael Petch