2017-10-29 7 views
0

私はアセンブリを学ぼうとしていますが、まずコンパイルにNASMを使用していましたが、gccの.sファイルを使用できることを理解しました。私の目標はカスタム言語用のコンパイラを書くことができるからです。興味深いことに、Cコードをリンクしてコンパイルできるようになりました。興奮に満ちて、私はgccを使ってアセンブリ(.sファイル)をコンパイルし始め、それを検証し始めました。私がこれをしていたときには、主なラベル、f.eks、および_start以外の奇妙な構造を持つNASMアセンブリとは別の方法で構造化されていましたが、インテルのAT & T構文については言及していません。だから私の質問は次のようになります:gccアセンブリの出力の構造体の名前は何ですか

通常のアセンブリではgccの.sファイルとは異なる構造ですか、それともアセンブリの知識が十分でないのですか?それが別の構造であれば、それは名前を持っていますか?

私は時間のためにこれまで私の方法をGoogleにしようとしているが、私はgccのアセンブリを検索するとき、私は考えることができる他のもの、私はCのインラインアセンブリを取得...

助けてください、イムこれを理解していないから狂ってしまう。

+3

GCCの '-nostartfiles'オプションを使用しない限り、そのエントリポイントは_C_スタートアップランタイムコード(出力された' .s'ファイルにはありません)にあるため、 '_start'ラベルは生成されません。その場合のエントリポイントは 'main'であり、' main'はCDECL呼び出し規約に準拠しています。 –

+2

あなたはおそらく 'as'を探しています:http://sourceware.org/binutils/docs/as/ところで、私は、アセンブリよりむしろLLVM ILをターゲットにする方がずっと簡単だと思います。あなた自身のコンパイラ。 – tkausl

+0

**あなたのターゲットプラットフォームABIに準拠したコンパイル機能をNASMでも作成できます。次に、C/C++コードと一緒にリンクすることができます。実際にはアプリケーションでアセンブリを使用する方法ASMの重要な小さなビットはほとんどなく、ほとんどをC++に保ちます。 .sファイルについての魔法はありません。リンクするために何らかの形で使えるようになります。同じルールに従って、NASMでグローバルラベルを定義することもできます。 gccはデフォルトでCランタイムライブラリを追加するので、gccをリンクに使用することができます(リンカ設定での作業を省くことができます)。 – Ped7g

答えて

0

gccは、翻訳単位に存在するすべての機能の定義を発行します。 (彼らがstatic inlineまたはstaticであり、未使用であるか、どこにでもインラインで選択する場合を除く)。

CRTの開始ファイル(デフォルトではgccによってリンクされ、コンパイルするたびにソースから再構築されません)は、_startの定義と、バイナリを逆アセンブルする場合に表示されるその他の機能を提供します。それらはリンク段階でのみリンクされ、.c.sにコンパイルするのではなく、gcc -S出力には表示されません。

関連性:How to remove "noise" from GCC/clang assembly output?コンパイラのasm出力を人間が読めるようにするためのヒント。

関連する問題