C言語の奥をつつく1ーmain関数は初めの関数じゃない!2008-09-02 Tue 09:58
Cの奥をつつくためにまずやるべきことは、最小の情報を解析する事ピヨ。
だからボクは次のCファイルを用意したピヨ。
どう?最小でピヨピヨ?という事で早速コンパイルしよう。一々開発環境で新規プロジェクトの作成をするのは面倒だからコマンドラインでコンパイルしよう! まずはVS Toolの方のコマンドラインプロンプトを立ち上げてから次の手順でコンパイルしてね。 cd /d ファイルパス cl mini.c /FA 次回からはコンパイル方法を省略するからよく覚えておいてね。じゃあ早速asmファイルを見てみよう。※画面の都合で一部改行しています
流石最小のコード!凄くシンプルピヨ♪このコードがやっている事は、 「EBPレジスタの値をスタックに退避して、すぐに値を戻して、もと来た場所へ戻る。」だけなんだ。ちなみに、xor eax, eaxは戻りを0にするための命令ピヨ。排他的論理和は片方だけ1の場合のみtrueとなるから必ず0となるわけさ。 ※xchg eax, eaxと見間違っていたから訂正しました。 この最小のコードから分かる事はmain関数以外にも処理がある事ピヨ。何で分かるかって?だって、retで戻っているんだもん。これでわかったと思うけど、C言語はmain関数以外にも様々な処理があるんだ。それは何の処理かと囀ると、環境変数の初期化、スタックに必要なヒープの確保・・・などのCを実行する上で必要な準備ピヨ。それで、何で終わったら戻るのかというと処理が正常か判断するためなんだ。C言語を触った事ある人ならば最後にreturn 0;とかするのは知っているよね?その値を受け取る処理が必要というわけさ。 今回はこれで終わり。 |
この記事のコメント最適化されると消えるのでしょうか
単なる戻り値でしょう うーん。書いてある内容分かっていないね。
xor eax, eaxが最適化されたら消えるといっているんだよ。 これは戻り値じゃないよ。 xor命令なんだから・・・
2009-01-31 Sat 09:59 | URL | インドリ #-[ 内容変更]
戻り値はeaxに入れるでしょ。だからeaxをxorを使ってゼロに設定しているんだよ。ソースに書かなくてもreturn 0を暗黙のうちにコンパイラが生成しているわけ。理解している?
2009-01-31 Sat 23:42 | URL | C入門者 #-[ 内容変更]
おっと、ごめんごめん。
デバッグ情報生成にしているとよくある xchg eax, eax(nop) と見間違ったよ。
2009-02-01 Sun 00:14 | URL | インドリ #-[ 内容変更]
|
コメントの投稿 |
||
|
|
||
| 管理者だけに閲覧 | ||
|
|
||
この記事のトラックバック |
|
| 無差別に技術をついばむ鳥 |
|