Ori*_*ski 3 assembly nasm opcode instructions
在查看由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"
Run Code Online (Sandbox Code Playgroud)
他们展示了在链接时应用重定位的位置.
[nnnnnnnn]显示绝对重定位(当链接器执行重定位时,某些节的基址将添加到偏移量中).例如,一旦二进制文件完全链接,push str2指令中的那些字节将被更改为包含基址.data+ 0x09.
(nnnnnnnn)显示了PC相对重定位(用于调用和分支,其中最终值必须相对于下一条指令的地址).例如,call func2指令中的字节将使用最终地址func2和后续指令(call func3)的地址之间的差异进行更新.
call func3指令本身没有括号,因为在这种情况下不需要重定位 - call指令需要一个相对地址,但是func3在同一部分内,所以相对地址已经知道(下面的指令是at .text + 0x21,func3at .text + 0x2c,at ,so相对地址0xb与最终地址无关.text.
圆括号和方括号意味着其中的指令字节部分取决于所引用对象的位置,该位置尚未完全已知(可能由操作系统中的链接器和/或程序加载器设置或更改)。
在这里,函数的地址未知,因为它们没有在此文件中定义,因此括号中全是零:
12 00000021 E8(00000000) call printf
13 00000026 E8(00000000) call fgets
Run Code Online (Sandbox Code Playgroud)
func3这里,相对于 的地址的地址call func3是已知的(距离是2Ch-21h=0Bh)并且不会改变,所以它是固定的,没有括号或中括号:
11 0000001C E80B000000 call func3
12 00000021 ...
...
16 0000002C 90 func3: nop
Run Code Online (Sandbox Code Playgroud)
这里, 的地址str2在汇编时部分已知,因为它可能在链接时改变,因为它取决于节之间的距离,所以有括号:
7 00000008 68[09000000] push str2
Run Code Online (Sandbox Code Playgroud)
我无法立即区分括号和方括号之间的区别,也许是代码与数据。NASM 文档可能是检查它的好地方。如果那里没有描述,可以使用 NASM 源代码,您也可以进行更多“测试”。