19

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

ここで何が問題で、どうすれば修正できますか?

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

4

4 に答える 4

23

.code32最初の行として追加します。

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

于 2012-11-30T01:22:52.547 に答える
20

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
于 2011-06-23T13:45:10.290 に答える
13

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

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

ただし、32 ビット アセンブラでは問題なく動作します。

于 2011-06-07T16:55:40.487 に答える
9

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

于 2011-07-20T11:18:07.903 に答える