"thiscall"まで一通り出揃ったので、x86の呼び出し規約シリーズは一旦完結となります。 同じ呼び出し規約でも、コンパイラによって微妙なクセがあったりして面白かったです。特にGCCで、ESPをその関数内で使うであろう最小値まで最初にSUBしてしまって、それによりcallerスタッククリーン系でもESPを戻さずに済むよう調整していたのが印象的です。他にもOpenWatcomのデフォルトのwatcall呼び出し規約が独自路線で面白い。 ちなみに、こんなに呼び出し規約が乱立してるのってx86(32bit)ならではみたいです。実はPowerPCやARM、MIPSなど他のCPUアーキテクチャでは、呼び出し規約がCPU側のドキュメントに載っているようです。つまりCPU側の仕様に含まれていると考えられます。そのせいか、各アーキテクチャ毎に1種類の呼び出し規約、みたいな形でシンプルになっているようです。まぁ他のCPUって汎用レジスタがx86(32bit)の倍以上はあるのばっかりなんで、引数は殆どレジスタ渡しになってるみたいですね。 この後は、引き続き4-5月も他に習い事が出来てしまってますので、スピードを一旦緩め、IBM PC 5150からの系譜やDOSの拡張メモリ(EMSやらXMSなど)について簡単にまとめていこうかと思います。本当はそっちが先だったんですが・・・DOSの拡張メモリを調べていく内にIBM PC 5150に突き当たってしまい、ROM BIOSが読めるのでじゃぁ0x7C00の謎も解いておこうか・・・ともの凄い寄り道をしてしまっている訳ですが。さらに何でDOSに今更・・・かというと、呼び出し規約でOpenWatcomやTurbo C++ 4.0Jでのパターンを確認しておきたかったのでFreeDOS環境を構築したのは良いのですが、あらためてDOSに触ると「あれ、EMSやらXMSってなんなんだっぺさ」と気になりだして。「はじめて読む486」にもEMSの話は出てきていますので。 それが終わったらまた軌道修正をかけます。大きく以下の4テーマを消化していく予定です。 + Windowsシステムのプログラミング消化 + Linux/UNIXプログラミング消化 + 実行可能イメージの歴史のまとめ ++ "Linkers and Loaders"に載っているのであればそれ読んでお仕舞い!にしたいところ。 + バイナリ解析・デバッグ系消化 "Linkers and Loaders"、前から気にはなってるんですが・・・あんまり評判も良い方ではないので躊躇してるんですよね・・・。日本語訳版と、原著版、両方立ち読みできると良いんですが。 バイナリ解析やデバッグ系は実行ファイルのレイアウトや、OSの仕組みを良く理解していないと分かりづらい。なので一番最後がベターかも。実行可能イメージは、a.outやELF,COFFやOMF,PEなど実行ファイルのフォーマットについて調べる必要が出てくるが、それがOS上で展開される箇所についてはやはりOSの仕組みを理解していないと分かりづらい。ということで、こんな順序に。 もしかしたら、さらにこの前にアセンブラプログラミングについて色々お試しが入るかも・・・。 まだまだ長いなぁ。