2017-10-14 44 views
2

私はAT & T構文で作業していましたが、私はintelを試してみると思っていました。私はこのコードを持っています:X86 intelの構文 - あいまいなサイズのmov、junk hの表現後?

.text 
     .global _start 

_start: 
     mov ebx, 0 
     mov eax, 1   
     int 80h 

どちらが正しいでしょうか?それは私がそれを変換する前に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

.intel_syntax noprefix' – Rafael

+1

woはあるように私は、グローバルディレクティブを考えました –

+0

.SECTIONの.text .globl _start – Rafael

答えて

2

古代版のGNUアセンブラでは、Intelの構文をサポートしていませんが、いくつかの問題があります。 -msyntax=intelは、NASM/MASMのintel構文に近いものを探しているとは不十分です。 -msyntax=intelは、オペランドの順序を切り替えて、デスティネーションが最初のオペランドであり、ソースオペランドが後になるようにします。ただし、すべてのレジスタ名に%パーセントのプレフィックスを付ける必要があります。そうMOV命令にエラーを修正します

mov %ebx, 0 
    mov %eax, 1 

を:だから、あなたはおそらくこれが働いているだろう見つけるだろう。これはおそらくあなたが望むものではありません。あなたのアセンブリファイルのそれぞれの上部にこれを追加することができます%プレフィックスなしインテルの構文を使用するには:あなたのアセンブリファイルのそれぞれの上部にこれを指定すると

.intel_syntax noprefix 

あなたは、もはやオプションで組み立てる必要がありません-msyntax=intel

junk 'h' after expressionエラーは、GNUのアセンブラ(Intel構文モードでも)が、ベースがサフィックスとして指定された定数をサポートしていないためです。あなたの場合80hが認識されません。 GNUアセンブラでは、16進数の場合には0xのような接頭辞で指定されるbaseが必要です。このエラーを解消するには、次のようにしてください。

int 0x80 

これらの問題を修正することで、このコードを組み立てることができます。

関連する問題