1. ホーム
  2. assembly

[解決済み] エラー: `push' の命令サフィックスが無効です [重複].

2022-02-07 06:26:48

質問

私は、アセンブリでスタックを介して関数に引数を渡すことを研究しようとしています。私は64ビットシステムのfedora 20を使用しています。

を試したところ、以下のようなコードになりました。

pushl %ebp

popl %ebp

エラーが出ます。 Error: invalid instruction suffix for `push'

このエラーをどのように克服すればよいのでしょうか?

でコンパイルしました。 as -ggstabs -o Function_Stack.o Function_Stack.c

解決方法は?

このエラーは、非常に単純な事実から生じています。 push 32ビットモードでは、16ビットと32ビットの即値を引数として受け付けます。しかし push 64ビットモードで使用する命令では、16ビットと64ビットの即値しか受け付けません。明らかに64ビットでコンパイルしているので、アセンブラはそのような命令をエンコードできないので、エラーを出します。また、オペランド・サイズを強制的に指定するために l サフィックスを push という命令があります。今ここに書いたことは、すべて pop ただし、即値ではなく、レジスタやメモリを受け取ります。

しかし、あなたはまた が必要です。 32ビットと64ビットのLinuxシステムでは、ABIが異なることに留意してください。ABIは、関数へのパラメータの渡し方、ユーザーモードアプリケーションからカーネルを呼び出す方法などを規定しています。あなたのコードは、引数の受け渡しにスタックを使い、(非常に)時代遅れの int $0x80 を呼び出す方法です。64ビットABIについて学ぶには、以下を参照してください。 この文書 .

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