4

我正在使用 AT&T 语法,但我想我会尝试英特尔。我有这个代码:

.text
        .global _start

_start: 
        mov ebx, 0
        mov eax, 1          
        int 80h

哪个应该返回 0,对吗?在我转换它之前,它与 AT&T 一起使用。

我正在组装使用:

 as out.s -msyntax=intel --32 -o out.o

但我得到:

out.s:5: Error: ambiguous operand size for `mov'
out.s:6: Error: ambiguous operand size for `mov'
out.s:7: Error: junk `h' after expression

我在哪里错了?

4

1 回答 1

6

GNU 汇编器的非古老版本提供对 Intel 语法的支持,但存在一些问题。-msyntax=intel如果您正在寻找更接近 NASM/MASM 的 intel 语法的东西,这还不够。-msyntax=intel将切换操作数的顺序,因此目标是第一个操作数,源操作数在后面。但是,您仍然需要在所有寄存器名称前加上%百分比。所以你可能会发现这会奏效:

    mov %ebx, 0
    mov %eax, 1  

这可能会修复MOV指令上的错误。这可能不是你想要的。要使用不带前缀的 Intel 语法,%您可以将其添加到每个程序集文件的顶部:

.intel_syntax noprefix

通过在每个汇编文件的顶部指定此选项,您不再需要使用该选项进行汇编-msyntax=intel

junk 'h' after expression错误是因为 GNU 的汇编器(即使在 Intel 语法模式下)不支持将基数指定为后缀的常量。在你的情况下80h不被认可。GNU 汇编器需要使用前缀来指定基数,例如0x十六进制。因此,要消除此错误,请使用:

    int 0x80

修复这些问题应该允许此代码组装。

于 2017-10-14T20:24:46.773 回答