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