装配jmp偏移是什么意思?

问题描述 投票:1回答:1

我用了

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>
assembly x86 disassembly
1个回答
3
投票

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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.