web-dev-qa-db-ja.com

ガスでの組み立て時のプッシュの無効な命令サフィックス

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

ここで何が問題になっていて、どうすれば修正できますか?

問題はいくぶん この質問 に関連していますが、質問のエラーと指示は異なります。

19
vitaut

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
19
Anu

先頭に.code32を最初の行として。

--32オプションは、ターゲットを32ビットプラットフォームに変更します。

22
Xiao Jia

64ビットのアセンブラで組み立てていますか?コードは32ビットのように見えます。 64ビットアセンブラを使用すると、コードでこのエラーが発生します。

example.s:6:suffix or operands invalid for `Push'

しかし、32ビットのアセンブラーでは正常に動作します。

13
Carl Norum

「64ビット構文」を使用する必要があります。または、「--32」オプションを使用できます。これにより、アセンブラはターゲットをi386プラットフォームに変更します。

8
rem