現代のマシンで古いプロジェクトをコンパイルしようとしています。私はこの古いプロジェクトがGCC/GASの古い(2.x)バージョンを使用していたので、最新のバージョンでコンパイルできるように、それをクリーンアップする必要があることを知っています。古い32ビットGASコードを現在のGASアセンブラに変換する必要があります(pushfl/popl)
問題のコード:
__get_flags:
pushfl
popl %eax
ret
gas
がpushfl
は命令ではないと文句を言い。私が読んだところでは、これは廃止予定の古いGNUニーモニックですが、確かにx86_64相当のものがなければなりませんか?
このコードをx86_64に変換する方法に加えて、pushfl
とpushfq
などのニーモニックがどこに記述され、定義され、文書化されているかを説明できるのは素晴らしいことです。私は、ガスの作品であることはかなり確信しています...
注:私は2.21
私は厳密にこれを行うには、元の例では 'eax'でしたが、ここで(pushfの後で)これを試してみると、エラー:'エラー: 'pop 'のオペランドタイプの不一致。ありがとう! –
私はx86_64のすべてのスタック操作が暗黙的に64ビットであるため、32ビットの対応は利用できませんが、16ビットのものは使用できます。 http://www.x86-64.org/documentation/assembly.html –
はい、あなたは正しいですか?x86_64の 'push /' pop'は64bitであるか、明示的に16bitに上書き可能です。これは主な違いです。32bitプッシュ/ 64ビットモードで動作しているときにポップアップする。 gccインラインアセンブリを使用する場合は、レジスタ名を指定する必要はなく、プレースホルダを使用できるため、レジスタの幅/名前に依存しない特定の状況でコードを作成することができます。あなたのコードが上記の関数をどのように使用するかについてもう少し詳しく知ることは役に立ちます。 –