【问题标题】:What does assembly jmp offset <label+offset> mean?程序集 jmp offset <label+offset> 是什么意思?
【发布时间】:2016-07-02 18:01:35
【问题描述】:

我用过

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>

【问题讨论】:

  • 请记住,jmp 是相对的,而不是绝对的。所以这是一个偏移量,而不是地址。
  • 我会改正的。谢谢。
  • jmp 20 &lt;loop+0x20&gt; 中,&lt;loop+0x20&gt; 是反汇编程序提供的信息输出。在这种情况下,JMP相对于 JMP 指令本身的结尾。下一条指令位于 0xf 处,因此汇编器将相对跳转编码为从跳转结束开始的 +0x11。 0x11+0x0f = 0x20。在操作码输出eb 11中可以看到11的相对编码。
  • 旁注The full dump (AT&amp;T) is 应该是The full dump (INTEL) is
  • 信息部分&lt;loop+0x20&gt; 表示跳转的目标是距离标签loop(即当前函数的开头)开头的0x20 字节(十进制32)。很容易看出循环开始的0x20是20: 83 7d fc 09 cmp DWORD PTR [ebp-0x4],0x9(注意20:开头)。

标签: assembly x86 disassembly


【解决方案1】:

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

这种表示在其他设置中更有帮助。例如,如果标签aints 数组的基数,那么&lt;a+0x20&gt; 将指定数组的第32 个字节,即a[8]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2019-08-26
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多