Assembly 气体语法,如何推动?

Assembly 气体语法,如何推动?,assembly,syntax,gnu-assembler,Assembly,Syntax,Gnu Assembler,煤气公司拒绝了我所有的加油 “错误的指令前缀” 。我不明白为什么…(示例伪代码) 我也做不到 int 0x80 直接在上面的脚本中。它说 “int”的操作数大小不匹配 我试过int80h,也不起作用 我遗漏了什么?看起来您使用的是x86\u 64体系结构,但正在尝试汇编x86特定代码。您需要将--32标志传递到气体: $ as --32 -ofile.o file.asm 有了这个命令行,我就能够汇编您的代码-没有这个标志,我得到了错误的指令前缀错误 我也做不到 int 0x80 int

煤气公司拒绝了我所有的加油

“错误的指令前缀”

。我不明白为什么…(示例伪代码)

我也做不到

int 0x80
直接在上面的脚本中。它说

“int”的操作数大小不匹配

我试过
int80h
,也不起作用


我遗漏了什么?

看起来您使用的是
x86\u 64
体系结构,但正在尝试汇编
x86
特定代码。您需要将
--32
标志传递到
气体

$ as --32 -ofile.o file.asm
有了这个命令行,我就能够汇编您的代码-没有这个标志,我得到了
错误的指令前缀
错误

我也做不到

int 0x80
int 0x80

int
指令需要一个立即操作数(中断向量号),
gas
要求立即操作数前面加上
$
(这是您为
mov
指令所做的正确操作):


看起来您使用的是
x86\u 64
体系结构,但尝试汇编
x86
特定代码。您需要将
--32
标志传递到
气体

$ as --32 -ofile.o file.asm
有了这个命令行,我就能够汇编您的代码-没有这个标志,我得到了
错误的指令前缀
错误

我也做不到

int 0x80
int 0x80

int
指令需要一个立即操作数(中断向量号),
gas
要求立即操作数前面加上
$
(这是您为
mov
指令所做的正确操作):


int 0x80
应该是
int$0x80
(注意
$
,因为它是立即数操作数)

关于
pushl
,我猜您使用的是为64位目标配置的GNU汇编程序版本<代码>推送r32在64位模式下不可编码,您可以在中的
推送
说明中看到。您可以改用
pushq%rax

然而,从代码的角度看,您似乎在编写一个32位的应用程序,因此您可能应该告诉汇编程序使用32位模式(将
--32
传递到
as、
-m32
传递到
gcc


如果您使用
ld
链接,您还必须使用
-m
ld
指定仿真模式,例如
-m elf\u i386
(要找出可用的仿真模式,请使用
ld-V
)。另一种方法是链接到
gcc
,例如
gcc-m32 foo.o

int 0x80
应该是
int$0x80
(注意
$
,因为它是立即数操作数)

关于
pushl
,我猜您使用的是为64位目标配置的GNU汇编程序版本<代码>推送r32在64位模式下不可编码,您可以在中的
推送
说明中看到。您可以改用
pushq%rax

然而,从代码的角度看,您似乎在编写一个32位的应用程序,因此您可能应该告诉汇编程序使用32位模式(将
--32
传递到
as、
-m32
传递到
gcc

如果您使用
ld
链接,您还必须使用
-m
ld
指定仿真模式,例如
-m elf\u i386
(要找出可用的仿真模式,请使用
ld-V
)。另一种方法是链接到
gcc
,例如
gcc-m32 foo.o