为什么下面的代码在气体中是非法的?
# cat -n gas.asm
1
2 .code64
3 pushb $12
4
# as gas.asm
gas.asm: Assembler messages:
gas.asm:3: Error: suffix or operands invalid for `push'
不匹配:
| Opcode* | Instruction | Op/En | 64-Bit Mode | Compat/Leg Mode | Description |
| 6A | PUSH imm8 | C | Valid | Valid | Push imm8. |
但是,以下代码适用于NASM。
bits 64
push byte 12
为什么气体在X86-64平台上出现错误?
谢谢!
答案 0 :(得分:2)
请参阅this thread。
引用:
我认为你所指的是' 0x6A PUSH imm8'。 这不推动 字节到堆栈。它推送一个字节值,编码为。的一部分 指令,作为字(16位)或CPU大小[longword(32-bit)) 对于32位CPU和64位CPU的四字(64位)]取决于 当前CPU模式和大小覆盖前缀的堆栈大小。
简而言之,这实际上是pushw
。 gas
明确说明这一事实并强迫您使用pushw $12
。