私は空のプログラムを書いて、stackoverflow コーダーを悩ませていますが、そうではありません。私はちょうどgnuツールチェーンを調べています。
以下は私には深すぎるかもしれませんが、空のプログラムの物語を続けるために、GNU が消費するものである C コンパイラの出力を調べ始めました。
gcc version 4.4.0 (TDM-1 mingw32)
test.c:
int main()
{
return 0;
}
gcc -S test.c
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl $0, %eax
leave
ret
ここで何が起こっているのか説明できますか? ここにそれを理解するための私の努力があります。as
マニュアルと最小限の x86 ASM の知識を使用しました。
.file "test.c"
論理ファイル名のディレクティブです。.def
: ドキュメント「シンボル名のデバッグ情報の定義を開始する」によると。シンボル(関数名・変数?)とは何ですか?デバッグ情報とは?.scl
: ドキュメントには、「ストレージ クラスは、シンボルが静的であるか外部であるかにフラグを付けることができます」と記載されています。これは、私が C から知っているのと同じ静的および外部ですか? そして、その「2」は何ですか?.type
: パラメータを「シンボル テーブル エントリのタイプ属性として」保存します。手がかりがありません。.endef
: 問題なし。.text
:これは問題です。セクションと呼ばれるもののようで、コードの場所であることを読みましたが、ドキュメントはあまり教えてくれませんでした。.globl
「シンボルをldに見えるようにします。」、マニュアルはこれについて非常に明確です。_main:
これは、メイン関数の開始アドレス (?) である可能性がありますpushl_
: EBP をスタックに配置するロング (32 ビット) プッシュmovl
: 32 ビット移動。疑似 C:EBP = ESP;
andl
: 論理積。Pseudo-C:ESP = -16 & ESP
、これが何を意味するのかよくわかりません。call
: IP をスタックにプッシュし (呼び出されたプロシージャが戻る方法を見つけることができるように)、現在の場所に進み__main
ます。(__main とは?)movl
: このゼロは、コードの最後に返す定数でなければなりません。MOV はこのゼロを EAX に配置します。leave
: ENTER 命令 (?) の後にスタックを復元します。なんで?ret
: スタックに保存されている命令アドレスに戻ります
ご協力ありがとうございました!