我将NASM源“移植”到GAS,我发现了以下几行代码:
push byte 0
push byte 37
GAS不允许“推送字节”或“推送”。
我应该如何将上述代码翻译成GAS语法?
由于
答案 0 :(得分:4)
pushb
已从GAS中删除。您应该能够使用push
命令获得相同的效果。更多信息是here。
答案 1 :(得分:2)
1) push byte
64位编译为与push
相同,但如果推送的东西大于一个字节则拒绝编译:
push 0x0000
push 0x01
push 0x0001
push 0x10
与:
相同push byte 0x0000
push byte 0x01
push byte 0x0001
push byte 0x10
但是以下失败:
push byte 0x0100
push byte 0x1000
push byte 0x01000000
push byte 0x10000000
所有这些都编译成指令的6a XX
形式。
2) NASM和GAS会根据操作数大小自动决定使用哪种表单:
GAS 2.25:
push $0x0000
push $0x01
push $0x0001
push $0x10
push $0x0100
push $0x1000
push $0x01000000
push $0x10000000
编译为与NASM相同:
push 0x0000
push 0x01
push 0x0001
push 0x10
push 0x0100
push 0x1000
push 0x01000000
push 0x10000000
objdump的:
0: 6a 00 pushq $0x0
2: 6a 01 pushq $0x1
4: 6a 01 pushq $0x1
6: 6a 10 pushq $0x10
8: 68 00 01 00 00 pushq $0x100
d: 68 00 10 00 00 pushq $0x1000
12: 68 00 00 00 01 pushq $0x1000000
17: 68 00 00 00 10 pushq $0x10000000
因此,GAS中的push
与NASM中的push byte
相同,但没有错误检查。
3) GAS中存在 的修饰符为w
,如下所示:
pushw $0
编译为:
0: 66 6a 00 pushw $0x0
即,添加0x66
前缀以切换16位操作。
NASM的等同物是:
push word 0
4)与mov
的区别在于我们无法控制任意推送大小:它们都是固定数量的堆栈。
我们可以控制指令编码的唯一参数是包含0x66
前缀。
其余部分由段描述符确定。请参阅Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015。