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
突っ込み所満載なのでよろしくお願いします。