将 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
)。
根据一些文档和 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
)。