【发布时间】: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 <loop+0x20>中,<loop+0x20>是反汇编程序提供的信息输出。在这种情况下,JMP相对于 JMP 指令本身的结尾。下一条指令位于 0xf 处,因此汇编器将相对跳转编码为从跳转结束开始的 +0x11。 0x11+0x0f = 0x20。在操作码输出eb 11中可以看到11的相对编码。 -
旁注
The full dump (AT&T) is应该是The full dump (INTEL) is -
信息部分
<loop+0x20>表示跳转的目标是距离标签loop(即当前函数的开头)开头的0x20 字节(十进制32)。很容易看出循环开始的0x20是20: 83 7d fc 09 cmp DWORD PTR [ebp-0x4],0x9(注意20:开头)。
标签: assembly x86 disassembly