CASL 1 のプログラミング

コンピュータ構成と機械語っていう講義での使用言語が CASL1 だったので今期はかなりの割合で CASL1 を使ったプログラミングをしてた。
何で CASL1 なんか使っていたんだろうか。せめて CASL2 なら基本情報技術者試験で使えたのに。(午後で使えるよね?)


で、まぁ最終課題を作ったりしてたわけなんだけど、これのバグが全然取れなくてすげー悩んだ。
課題自体は簡単で、「文字(列)として与えられる標準入力からの入力を数値に変換し、メモリへ格納せよ」みたいな内容。
確保したデータ領域に入力を保存してやって、それを引き算と掛け算を使いながら数値に変換するだけなんだけど、どう書いてもデータ領域に作った配列がちゃんと参照されない。
文法的な部分で間違ってるのかなぁ、と思って LD 命令の使い方だとか LEA の使い方だとかを色々検証してみたけど、結局分からなかった。


まぁいいかと思いながらもデータ領域の確保の宣言部分を見てみたら、配列の宣言じゃなくて定数の宣言してたことに気付いて死にたくなった。
配列の宣言には

NIN	DS	80

みたいに書かなきゃいけないんだけど、

NIN	DC	80

って書いてたorz


たまにはソースを全部貼っておくか。
MLT10 は GR1 の値を 10 倍する関数。
全体としては、入力された 10 進 3 桁の文字列を数値に変換して N にストアするプログラム。
CASL2000 以外の環境で動くかどうかわかりません。

EX	START
	IN	NIN,C3
	LD	GR0,C3
	LD	GR1,0
	LEA	GR3,0
L1	LD	GR2,NIN,GR3
	LEA	GR3,1,GR3
	SUB	GR2,C48
	ST	GR2,TMP
	ADD	GR1,TMP
	SUB	GR0,ONE
	JZE	ANS
	CALL	MLT10
	JMP	L1
ANS	ST	GR1,N
	EXIT
C48	DC	#0030
NIN	DS	80
C3	DC	3
N	DS	1
TMP	DS	1
ONE	DC	1
ZERO	DC	0
	END
MLT10	START
	PUSH	0,GR2
	PUSH	0,GR3
	LEA	GR2,1
	ST	GR1,W
	LD	GR3,W
LMLT10	ADD	GR3,W
	LEA	GR2,1,GR2
	CPA	GR2,TEN
	JNZ	LMLT10
	ST	GR3,W
	LD	GR1,W
	POP	GR3
	POP	GR2
	RET
W	DS	1
TEN	DC	10
	END

突っ込み所満載なのでよろしくお願いします。