GAS语法,如何推送?

时间:2014-07-03 06:58:52

标签: assembly syntax gas

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,也没有工作。

我错过了什么?

2 个答案:

答案 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