無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

C言語の奥をつつく1ーmain関数は初めの関数じゃない!

Cの奥をつつくためにまずやるべきことは、最小の情報を解析する事ピヨ。
だからボクは次の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;とかするのは知っているよね?その値を受け取る処理が必要というわけさ。
今回はこれで終わり。
別窓 | C | コメント:4 | トラックバック:0 | ∧top | under∨
<<C言語関連記事に関する目次 | 無差別に技術をついばむ鳥 | C言語の奥をつつく0ー始まりは何時もコンパイラオプション。>>

この記事のコメント

最適化されると消えるのでしょうか
単なる戻り値でしょう
2009-01-31 Sat 08:42 | URL | baka #en9qG856[ 内容変更]
うーん。書いてある内容分かっていないね。
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 | インドリ #-[ 内容変更]
∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |