为什么'pushb $ 12'的气体错误?

时间:2012-07-02 10:00:38

标签: x86-64 gas

为什么下面的代码在气体中是非法的?

# 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平台上出现错误?

谢谢!

1 个答案:

答案 0 :(得分:2)

请参阅this thread

引用:

  

我认为你所指的是' 0x6A PUSH imm8'。 这不推动   字节到堆栈。它推送一个字节值,编码为。的一部分   指令,作为字(16位)或CPU大小[longword(32-bit))   对于32位CPU和64位CPU的四字(64位)]取决于   当前CPU模式和大小覆盖前缀的堆栈大小。

简而言之,这实际上是pushwgas明确说明这一事实并强迫您使用pushw $12