2017-10-14 359 views
2

我正在与AT & T语法,但认为我会尝试英特尔。我有这样的代码:X86英特尔语法 - MOV的大小,表达式后的垃圾h?

.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 

我要去哪里错了吗?

+0

我想到了全局指令作为是一禾在 – Rafael

+1

文件汇编文件'.intel_syntax noprefix' –

+0

.section伪的.text .globl _start – Rafael

回答

2

非古老的GNU汇编语言版本提供对英特尔语法的支持,但也有一些问题。如果你正在寻找更接近NASM/MASM的intel语法的东西,那么-msyntax=intel是不够的。 -msyntax=intel将切换操作数的顺序,因此目的地是第一个操作数,源操作数在之后。但是,您仍然需要在%%前加上所有注册名称。所以你可能会发现这会工作:

mov %ebx, 0 
    mov %eax, 1 

这可能会固定在MOV指令的错误。这可能不是你想要的。要使用Intel语法,而不%前缀,你可以添加这对每个组件文件的顶部:

.intel_syntax noprefix 

通过在每个组件文件的顶部指定此就不再需要与选择组装-msyntax=intel

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

int 0x80 

解决这些问题应该允许这些代码进行组装。