程序集jmp offset <label + offset>是什么意思?

时间:2016-07-02 18:01:36

标签: assembly x86 disassembly

我用过

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>

1 个答案:

答案 0 :(得分:2)

Hex 20是跳转目标地址。 loop+0x20意味着有用,但在这种情况下,它并不是很有用。反汇编程序找到了最接近20的符号地址。在这种情况下,它是loop。它重新计算20作为该标签的偏移量。由于标签位于地址0,因此简化为0+0x2020,与您期望的目标相等。

此表示在其他设置中更有用。例如,如果标签a用于int s数组的基数,则<a+0x20>将指定数组的第32个字节,即a[8]