assmblyのスタックを介して関数に引数を渡すことを研究しようとしています。 Fedora 20、64ビットシステムを使用しています。
次のコードを試すと、
pushl%ebp
ポップル%ebp
エラーが表示されます。エラー:「プッシュ」の無効な命令サフィックス
どうすればこのエラーを克服できますか?
-ggstabs -o Function_Stack.o Function_Stack.cとしてコンパイルしました
発生しているエラーは非常に単純な事実から発生します。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ビットコードを出力するためのスイッチ。