テストプラットフォームは32ビットLinuxです。
基本的に、gccを使用してIntelスタイルとAt&Tスタイルの両方のアセンブリコードを生成できることは知っていますが、できない nasm/tasmを直接使用して、生成されたIntelスタイルのアセンブリコードgccをコンパイルします。
私はWindowsとLinuxプラットフォームの両方でプロジェクト分析asmコードを実行しているので、nasm\yasmのようなプラットフォームに依存しないアセンブラーで両方をコンパイルできれば、はるかに簡単な時間を過ごすことができると思います...
だから私の質問は、Linux上のcソースコードからnasmコンパイル可能なアセンブリコードを生成する方法ですか?
オブジェクトファイルを逆アセンブルする方が、gccで生成されたアセンブリコードを使用するよりも良い方法だと思います。
まず、ソースコードからオブジェクトファイルを生成します。
gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
-fno-asynchronous-unwind-tables
:.eh_frame
のような不要なセクションを生成しません
-O2
は、asmがひどくないように最適化します。オプションで、-Os
(速度よりもサイズ)または-O3
(自動ベクトル化を含む完全な最適化)を使用します。また、CPUを調整し、CPUがサポートする拡張機能を-march=native
または-march=haswell
または-march=znver1
(Zen)で使用することもできます。
-s
:実行可能ファイルを小さくする(ストリップ)
-c -o main.o
:コンパイルしますがリンクしません。main.o
というオブジェクトファイルを生成します
objconv を使用してnasm
コードを生成します。
objconv -fnasm main.o
結果はmain.asm
に保存されます。
結果はNasm構文に非常に近くなります。ただし、警告/エラーを排除するために、いくつかの小さな調整が必要になる場合があります。 Nasmでコンパイルしてみてください
nasm -f elf32 main.asm
エラー/警告を手動で修正します。例えば:
align=N
行から.SECTION
およびexecute
/noexecute
ワードを削除します。global
宣言からテキスト: function
を削除しますdefault rel
行を削除しますGccを使用して、ステップ3でNasmによって生成された結果のmain.o
をリンクします。
gcc main.o
Ldを使用してリンクすることもできますが、はるかに困難です。
怠け者の場合: https://github.com/diogovk/c2nasm
そこには、バブケンバーダニアンの提案を自動的に実行するスクリプトがあります。
objconv
なしでそれを行う方法がここにあります
ndisasm -u <(objdump -j .text -d main.o | cut -d: -f2 | cut -d$'\t' -f 2 | Perl -ne 'next if /file/; s/\s+//g; print' | xxd -r -p)