根据一些文档和this answer,可以在Linux中使用带有Intel语法的GAS,而不是默认的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
。怎么了?
答案 0 :(得分:2)
您似乎对某些指令使用NASM语法,以及十六进制文字。您需要更改这些以使用GNU AS语法。
而不是section name
,您应该使用.section name
(带有前导点)。如果是.section .text
和.section .data
,您可以将这些内容简化为.text
和.data
。
同样,global symbol
在GNU AS语法中应该是.global symbol
(或.globl symbol
)。
关于十六进制文字,manual可以这样说:
十六进制整数是'0x'或'0X',后跟一个或多个从'0123456789abcdefABCDEF'中选择的十六进制数字。
因此80h
应写为0x80
(或0X80
)。