GAS拒绝了我的所有推送
"错误的指令前缀"
。我无法弄清楚为什么......(样本虚拟代码)
.section .text
.global _start
_start:
movl $10, %eax
pushl %eax
movl $1, %eax
int $exit
.data
.equ exit, 0x80
我也无法做到
int 0x80
直接在上面的脚本中。它说
操作数大小与`int' 不匹配
我已经尝试int 80H
,也没有工作。
我错过了什么?
答案 0 :(得分:3)
int 0x80
应为int $0x80
(请注意$
,因为它是一个直接操作数)
关于pushl
,我猜测您正在使用为64位目标配置的GNU汇编程序版本。 push r32
在64位模式下是不可编码的,您可以在Intel's Software Developer's Manual中的push
说明中看到。您可以改为使用pushq %rax
。
但是,查看代码似乎是在编写32位应用程序,因此您应该告诉汇编程序使用32位模式(将--32
传递给{{1} }或as,
到-m32
)。
如果您要与gcc
进行关联,则还必须为ld
ld
指定仿真模式,例如-m
(要找出可用的模拟模式,请使用-m elf_i386
)。另一种方法是与ld -V
链接,例如gcc
。
答案 1 :(得分:2)
看起来您使用x86_64
架构,但尝试汇总x86
特定代码。您需要将--32
标记传递给gas
:
$ as --32 -ofile.o file.asm
使用此命令行,我能够汇编代码 - 没有标记,我收到wrong instruction prefix
错误。
我也无法做到
int 0x80
int
指令需要一个立即操作数(中断向量编号),而gas
要求立即操作数以$
为前缀(您正确为mov
做了}说明):
int $0x80