我用过
objdump -M intel -d test
和
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
如果它从0的标签循环跳转到偏移20,这是有意义的。
令我困惑的是语法。为什么我有两个20?
20 <loop+0x20>
答案 0 :(得分:2)
Hex 20
是跳转目标地址。 loop+0x20
意味着有用,但在这种情况下,它并不是很有用。反汇编程序找到了最接近20
的符号地址。在这种情况下,它是loop
。它重新计算20
作为该标签的偏移量。由于标签位于地址0
,因此简化为0+0x20
,20
,与您期望的目标相等。
此表示在其他设置中更有用。例如,如果标签a
用于int
s数组的基数,则<a+0x20>
将指定数组的第32个字节,即a[8]
。