assembly jmp offset <label+offset> 是什么意思?

What does assembly jmp offset <label+offset> mean?

我用了

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>

Hex 20为跳转目标地址。 loop+0x20 本来是有帮助的,但在这种情况下并不是很有帮助。反汇编程序找到了最接近 20 的符号地址。在本例中为 loop。它重新计算 20 作为该标签的偏移量。由于标签位于地址 0,这简化为 0+0x20,即 20,它等于您期望的目标。

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