我当时在使用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/