将 GAS 与 .intel_syntax 一起使用时出错

Error when using GAS with .intel_syntax

根据一些文档和 this answer,可以在 Linux 中使用 GAS 和 Intel 语法而不是默认的 AT&T 语法。

我尝试编译以下简单代码,包含在专用文件中file.s

.intel_syntax noprefix

section .data

section .text
        global _start

_start:
        mov eax, 1      # some random comments

        mov ebx, 0      

        int 80h         

如果我运行as file.s -o file.o,会产生如下错误:

is2_exit.s: Assembler messages:
is2_exit.s:3: Error: no such instruction: `section .data'
is2_exit.s:5: Error: no such instruction: `section .text'
is2_exit.s:6: Error: no such instruction: `global _start'
is2_exit.s:13: Error: junk `h' after expression

好像根本没有考虑.intel_syntax。怎么了?

您似乎对某些指令以及十六进制文字使用了 NASM 语法。您需要更改这些以使用 GNU AS 语法。

而不是 section name 你应该使用 .section name (带前导点)。在 .section .text.section .data 的情况下,您可以将它们简化为 .text.data.

同样,global symbol在GNU AS语法中应该是.global symbol(或.globl symbol)。


关于十六进制文字,manual 是这样说的:

A hexadecimal integer is '0x' or '0X' followed by one or more hexadecimal digits chosen from `0123456789abcdefABCDEF'.

所以80h应该写成0x80(或0X80)。