web-dev-qa-db-ja.com

エラー:「プッシュ」の無効な命令サフィックス

assmblyのスタックを介して関数に引数を渡すことを研究しようとしています。 Fedora 20、64ビットシステムを使用しています。

次のコードを試すと、

pushl%ebp

ポップル%ebp

エラーが表示されます。エラー:「プッシュ」の無効な命令サフィックス

どうすればこのエラーを克服できますか?

-ggstabs -o Function_Stack.o Function_Stack.cとしてコンパイルしました

16
Melvin

発生しているエラーは非常に単純な事実から発生します。32ビットモードのPush命令は、引数として16ビットおよび32ビットの即値を受け入れます。ただし、64ビットモードで使用されるPush命令は、16ビットと64ビットの即値のみを受け入れます。コードを64ビットとして明確にコンパイルしているため、アセンブラーはそのような命令をエンコードできない可能性があるため、エラーをスローします。また、l命令にPush接尾辞を追加して、オペランドサイズを自分で強制することにも注意してください。ここで書いたものはすべて、即時ではなくレジスタ/メモリを受け入れることを除いて、popの場合とまったく同じです。

ただし、32ビットと64ビットのLinuxシステム間のABIの違いに留意する必要がある必要もあります。 ABIは、とりわけ、パラメーターが関数に渡される方法、およびユーザーモードアプリケーションからカーネルを呼び出す方法を指定します。あなたのコードは明らかに32ビットモード用に書かれており、引数を渡すためにスタックをどのように使用するか、(非常に)廃止されたint $0x80 syscallsを呼び出す方法。 64ビットABIについて学習するには、 このドキュメント を参照してください。

または、64ビットシステムで32ビットコードをコンパイルすることもできます。このような実行可能ファイルは、64ビットシステムに必要な32ビットランタイムライブラリがインストールされている場合に機能します。ほとんどのディストリビューションでは、さまざまな方法でそれを行うことができます。コンパイラasには--32 32ビットコードを出力するためのスイッチ。

26