GNUアセンブラでファイルをアセンブルすると、次のエラーが発生します。
hello.s:6:エラー:「プッシュ」の無効な命令サフィックス
これが私がアセンブルしようとしているファイルです:
.text
LC0:
.ascii "Hello, world!\12\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
ここで何が問題になっていて、どうすれば修正できますか?
問題はいくぶん この質問 に関連していますが、質問のエラーと指示は異なります。
64ビット命令
デフォルトでは、ほとんどの操作は32ビットのままで、64ビットの対応はREXプレフィックスの4番目のビットによって呼び出されます。つまり、32ビットの各命令には64ビットの自然な拡張があり、拡張レジスタは64ビットの命令では無料です。
movl $1, %eax # 32-bit instruction
movq $1, %rax # 64-bit instruction
pushl %eax # Illegal instruction
pushq %rax # 1 byte instruction encoded as pushl %eax in 32 bits
pushq %r10 # 2 byte instruction encoded as pushl preceeded by REX
先頭に.code32
を最初の行として。
--32
オプションは、ターゲットを32ビットプラットフォームに変更します。
64ビットのアセンブラで組み立てていますか?コードは32ビットのように見えます。 64ビットアセンブラを使用すると、コードでこのエラーが発生します。
example.s:6:suffix or operands invalid for `Push'
しかし、32ビットのアセンブラーでは正常に動作します。
「64ビット構文」を使用する必要があります。または、「--32」オプションを使用できます。これにより、アセンブラはターゲットをi386プラットフォームに変更します。