当查看 NASM 生成的列表文件时,我发现存在三种操作码:
- 不带括号。
- 带圆括号。
- 带方括号。
他们的意思是什么?它们分别在什么时候被使用?
这是一个列表文件的示例,演示了上述所有内容:
1 section .text
2 extern printf
3 extern fgets
4 00000000 313233 str3: db "123"
5 main:
6 00000003 68[00000000] push str1
7 00000008 68[09000000] push str2
8 0000000D 68[00000000] push str3
9 00000012 E8(00000000) call func1
10 00000017 E8(04000000) call func2
11 0000001C E80B000000 call func3
12 00000021 E8(00000000) call printf
13 00000026 E8(00000000) call fgets
14 0000002B C3 ret
15
16 0000002C 90 func3: nop
17 0000002D C3 ret
18
19
20 section .text1
21 00000000 90 func1: nop
22 00000001 90 nop
23 00000002 90 nop
24 00000003 C3 ret
25
26 00000004 90 func2: nop
27 00000005 90 nop
28 00000006 90 nop
29 00000007 C3 ret
30
31
32 section .data
33
34 00000000 313233343536373839 str1: db "123456789"
35 00000009 313233343536373839 str2: db "123456789"
它们显示了链接时将应用重定位的位置。
[nnnnnnnn]
显示绝对重定位(当链接器执行重定位时,某些节的基址将被添加到偏移量中)。例如一旦二进制文件完全链接,这些字节push str2
指令将被更改为包含基地址.data
+ 0x09
.
(nnnnnnnn)
显示 PC 相对重定位(用于调用和分支,其中最终值必须相对于下一条指令的地址)。例如中的字节call func2
指令将根据最终地址之间的差异进行更新func2
,以及以下指令的地址(call func3
).
没有括号call func3
指令本身,因为在这种情况下不需要重定位 -call
指令需要相对地址,但是func3
在同一节内,因此相对地址是已知的(以下指令位于.text + 0x21
, and func3
is at .text + 0x2c
,所以相对地址为0xb
无论最终地址如何.text
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)