X86英特尔语法-mov的大小太大了,表达式后垃圾h



我在AT&T语法,但我想试试intel。我有这个代码:

.text
.global _start
_start: 
mov ebx, 0
mov eax, 1          
int 80h

哪个应该返回0,对吧?AT&在我转换之前。

我正在使用进行组装

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

mov %ebx, 0
mov %eax, 1  

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

.intel_syntax noprefix

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

junk 'h' after expression错误是因为GNU的汇编程序(即使在英特尔语法模式下)不支持以基指定为后缀的常量。在您的情况下,80h无法识别。GNU汇编程序需要用前缀0x(十六进制)指定base。因此,要消除此错误,请使用:

int 0x80

修复这些问题应该允许汇编此代码。

最新更新