1

为什么下面的代码在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

为什么gas在X86-64平台上会出现这个错误?

谢谢!

4

1 回答 1

2

看到这个线程

引用:

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

简而言之,这实际上是一个pushw. gas明确这一事实并强制您使用pushw $12.

于 2012-07-02T10:13:59.340 回答