X86 intel 语法 - mov 的大小不明确,表达式后的垃圾 h?

X86 intel syntax - ambigious size for mov, junk h after expression?

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

.text
        .global _start

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

哪个应该return0,对吧?在我转换它之前它与 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

我哪里错了?

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

    mov %ebx, 0
    mov %eax, 1  

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

.intel_syntax noprefix

通过在每个程序集文件的顶部指定它,您不再需要 assemble 使用选项 -msyntax=intel

junk 'h' after expression 错误是因为 GNU 的 assembler(即使在 Intel 语法模式下)不支持将基指定为后缀的常量。在您的情况下 80h 无法识别。 GNU assembler 需要通过前缀指定基数,如 0x 表示十六进制。因此,要消除此错误,请使用:

    int 0x80

解决这些问题应该允许此代码assemble。