我当时在使用AT&T语法,但以为我会尝试intel。我有以下代码:

.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

我在哪里错了?

最佳答案

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

    mov %ebx, 0
    mov %eax, 1

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

通过在每个汇编文件的顶部指定此名称,您不再需要使用-msyntax=intel选项进行汇编。
junk 'h' after expression错误是因为GNU的汇编器(即使在Intel语法模式下)也不支持将基数指定为后缀的常量。您的情况下80h无法识别。 GNU汇编器要求基数由前缀(例如0x)指定为十六进制。因此,要消除此错误,请使用:
    int 0x80

解决这些问题应该可以汇编此代码。

关于x86 - X86 Intel语法-表达式后的mov,垃圾h的大小是否模棱两可?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46746145/

10-13 07:59