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。
我正在使用 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。