Sim's blog

電子工作はじめてみました

ICFP2007 (14)

2007-08-28 22:05:47 | ICFPプログラミングコンテスト
ICFP2007 (13) gene tableのpage 15の続きです。

helpシリーズで見忘れていた画像がありました。


その他、気づいたことです。

関数の最初はIIIから始まっています。これはRNA出力コマンドですが、Cから始まる無効なRNAを出力します。このRNAは関数にユニークなようです。また、関数からリターンするときも無効RNA、CFPICFPを出力します。つまりRNAを見れば、どの関数に入ったとか抜けたとかがトレースできるようになっているみたいです。まだ関数とトレース用RNAの対応表は作っていません。

関数の直後にはint24のchecksumが格納されています。これはcheckIntegrityを解析した結果わかったことです。
bool checkIntegrity(int size, int offset){
	int sum1;	//[BZ]
	int sum2;	//[BZ+18]

	sum2 = checksum(offset, size);
	offset += size;
	sum1 = [GZ+offset];
	rc = F;
	if(sum1 == sum2) rc = P;
	return;
}

ちなみにchecksumを求める計算はIを0、Cを1、Fを2、Pを3とみなして、sum = rol(sum, 2) ^ cという操作を関数の最初から最後まで行います。sumの初期値は1です。下のencode( )はICFPを0123に対応させています。rcは戻り値です。
int24 checksum(int24 offset, int24 size)
{
	int24 end = 0;
	int24 sum = 1;
	base t[3];

	if(size > 2500) size = 2500;
	end = offset + size;
	while(end != offset){
		sum = rol(sum, 2) ^ encode([GZ+offset]);
		offset++;
	}
	rc = sum;
}

9/1 追記 sizeの判定が逆でした。最大でも2500バイトしかチェックサムを求めないようです。
関数の最後は固定パターンになっています。
CPPPPPPIICIICIICIICIICIICIICIICIICIICCCFIICIICIFFCPICCFPICICFCPICIICIICIII
何か意味があるのでしょうか?

関数の戻り値のためのスタックは呼び出し側が確保します。通常のパラメータの前に置くので第0パラメータになります。
通常実行時のスタックのレイアウトは以下のようになっています。
[BZ]    ローカル変数
[BZ+??] リターンアドレス(int24が2つ)
[BZ+??] パラメータn
[BZ+??] パラメータn-1
...
[BZ+??] パラメータ1
[BZ+??] 戻り値

戻り値やローカル変数は関数によってはないこともあります。関数を呼び出すときは、パラメータをスタックに積んでから呼び出すので、ローカル変数の前にパラメータが置かれます。このとき、ローカル変数がスタック先頭ではなくなるのでコードが読みずらくなります。

本来の目的であるはずの画像の修復はどうでもよくなってきていて、中身を覗いて遊んでいます。

最新の画像もっと見る

コメントを投稿