X86 intel 语法 - mov 大小不明确,表达式后为垃圾 h?

use*_*341 4 x86 gnu-assembler att intel-syntax

我正在使用 AT&T 语法,但我想尝试一下英特尔。我有这个代码:

.text
        .global _start

_start: 
        mov ebx, 0
        mov eax, 1          
        int 80h
Run Code Online (Sandbox Code Playgroud)

哪个应该返回0,对吗?在我转换它之前,它是用 AT&T 做的。

我正在组装使用:

 as out.s -msyntax=intel --32 -o out.o
Run Code Online (Sandbox Code Playgroud)

但我得到:

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
Run Code Online (Sandbox Code Playgroud)

我哪里出错了?

Mic*_*tch 6

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

    mov %ebx, 0
    mov %eax, 1  
Run Code Online (Sandbox Code Playgroud)

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

.intel_syntax noprefix
Run Code Online (Sandbox Code Playgroud)

通过在每个汇编文件的顶部指定此项,您不再需要使用选项进行汇编-msyntax=intel

junk 'h' after expression错误是因为 GNU 的汇编器(即使在 Intel 语法模式下)不支持将基数指定为后缀的常量。在你的情况下80h不被识别。GNU 汇编器要求 base 由前缀指定,如0x十六进制。因此,要消除此错误,请使用:

    int 0x80
Run Code Online (Sandbox Code Playgroud)

修复这些问题应该允许此代码组装。