IOCCCコード解析その7

1984年 「The Grand Prize」受賞作品


short main[] = {
277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
-113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004,
14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9,
4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419,
0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0,
4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#',
0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712,
'p', 072163, 'r', 29303, 29801, 'e'
};
それが上記コードなんだが???なんでしょうね〜物凄く奇妙に見えるのは私だけでしょうか?main関数が配列になっている。short型の配列って事ですよね。これって実際に動作するのだろうか、と言うわけでコンパイルしてみた。ちなみにGCCでやってみた。-Wallをつけるとwarningが発生するけど、-Wallオプションつけないと何も言われないね〜ちゃんとコンパイルできたよ。で実行・・・セグメンテーション違反で落ちた!

環境がKnoppixだからかな!ヒントにはVax-11もしくはpdp-11でしか動かないみたいな事が書いてあるんですよ。ん〜残念。Vax-11やpdp-11ってのは古いコンピュータって事でいいのかな、ちなみに上記プログラムを会社のSunOSコンパイルして実行してみたんだよ。なんか永久ループを起こしたんだが途中で強制的にとめたよ。

はっきり言って良くわからないね。まず「short main[] = {}」が何を表しているのか、というか動作するのが不思議なんですよね。で小一時間ほど悩んで出した結論。c言語で作成した実行形式ファイルってのはmainから呼び出されるわけだが、そのmainってのはプログラム開始アドレスのラベルって事なんじゃないかな。と言うわけでmainってラベルがあれば、それが配列だろうが変数だろうがそこから処理を開始するって事?でいいの。

次にmain配列内に存在している数値等は直接機械語で処理が書かれているって感じだと思う。mainが指し示しているアドレスから順に処理が実行されていくわけだ。その内容は・・・わからないのでSunOS側でアセンブリコードを吐き出してみた。

良く考えればそうだよね。関数の名称は結局ラベルになるだけだもんね。main関数が特別なのはプログラムのスタート位置にあるって事でそれ以外は他の関数と同じとは言い切れないけど、そんなものだろう。main関数もラベルになるわけだ。


.section ".text",#alloc,#execinstr

.section ".data",#alloc,#write
.align 2
.global main
main:
.half 0x115,0x9dd,0xefdf,0x19
.skip 2
.half 0x1dd,0x3fb,0xbef
.skip 2
.half 0x3200,0xff8f,0x527f,0x52d7,0xfc12,0xe411
.skip 2
.half 0x4bc,0x2004,0x3a20,0x292d,0x808,0x808,0x11c4
.half 0xbe4,0xe5c4,0x9,0x1137,0x6,0x15c0,0x1
.half 0x8904
.skip 2
.half 0x9,0x15c2,0x200,0x892d,0x7e82,0x1f0,0x6
.skip 2
.half 0x4,0x500,0xf
.skip 2
.half 0x4,0x500,0x4
.skip 2
.half 0x4
.skip 6
.half 0x8
.skip 2
.half 0x4
.skip 2
.half 0x2c
.skip 2
.half 0xc
.skip 2
.half 0x4
.skip 2
.half 0x23
.skip 2
.half 0x10
.skip 2
.half 0x4
.skip 2
.half 0x1e
.skip 2
.half 0x16
.skip 2
.half 0x6176,0x78,0x6470,0x70,0x7473,0x72,0x7277
.half 0x7469,0x65
.type main,#object
.size main,162

ん〜多分どこかで永久ループの処理が入っているんだろうが分からんね〜ちなみにx86系で無限ループする最小コードってのがこれ
main=65259;
へ〜って感じですね。
ちなみに参考になったアドレス:http://ml.tietew.jp/cppll/cppll_novice/thread_articles/1578
そうそう、さらにちなみに、stringsコマンドで実行ファイルを見てみると、「: )-」と表示されたよ。本来は「:-)」と表示したかったんだろうが・・・しかし見れば見るほど訳の分からないコードですよね。