C言語の奥をつつく1ーmain関数は初めの関数じゃない!
だからボクは次のCファイルを用意したピヨ。
//mini.c
void main(){}
どう?最小でピヨピヨ?という事で早速コンパイルしよう。一々開発環境で新規プロジェクトの作成をするのは面倒だからコマンドラインでコンパイルしよう!
まずはVS Toolの方のコマンドラインプロンプトを立ち上げてから次の手順でコンパイルしてね。
cd /d ファイルパス cl mini.c /FA
次回からはコンパイル方法を省略するからよく覚えておいてね。じゃあ早速asmファイルを見てみよう。※画面の都合で一部改行しています
; Listing generated by Microsoft (R)
;Optimizing Compiler Version 15.00.21022.08
TITLE ファイル名
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
PUBLIC _main
; Function compile flags: /Odtp
_TEXT SEGMENT
_main PROC
; File ファイル名
; Line 1
push ebp
mov ebp, esp
xor eax, eax
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
流石最小のコード!凄くシンプルピヨ♪このコードがやっている事は、 「EBPレジスタの値をスタックに退避して、すぐに値を戻して、もと来た場所へ戻る。」だけなんだ。ちなみに、xor eax, eaxは戻りを0にするための命令ピヨ。排他的論理和は片方だけ1の場合のみtrueとなるから必ず0となるわけさ。
※xchg eax, eaxと見間違っていたから訂正しました。 この最小のコードから分かる事はmain関数以外にも処理がある事ピヨ。何で分かるかって?だって、retで戻っているんだもん。これでわかったと思うけど、C言語はmain関数以外にも様々な処理があるんだ。それは何の処理かと囀ると、環境変数の初期化、スタックに必要なヒープの確保・・・などのCを実行する上で必要な準備ピヨ。それで、何で終わったら戻るのかというと処理が正常か判断するためなんだ。C言語を触った事ある人ならば最後にreturn 0;とかするのは知っているよね?その値を受け取る処理が必要というわけさ。
今回はこれで終わり。