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
,它等于您期望的目标。
此表示在其他设置中更有帮助。例如,如果标签 a
是 int
数组的基数,那么 <a+0x20>
将指定数组的第 32 个字节,即 a[8]
。
我用了
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
,它等于您期望的目标。
此表示在其他设置中更有帮助。例如,如果标签 a
是 int
数组的基数,那么 <a+0x20>
将指定数组的第 32 个字节,即 a[8]
。