担当授業のこととか,なんかそういった話題。

主に自分の身の回りのことと担当講義に関する話題。時々,寒いギャグ。

十進数を一桁だけ順に表示する CASL II プログラム。

2024-04-29 14:52:05 | 情報系
その歩みは亀よりも遅く,そして気まぐれである。


いまや廃れた CASL II で 1 から 9 までの数字を順に表示するプログラムを作った。

これは FizzBuzz 問題の解答を作ための練習の一環である。

SAMPLE START
                LD GR0,=#0030
LOOP      ADDA GR0,=1
                ST GR0,DEC
                OUT DEC,=1 
                CPA GR0,=#0039
                JMI LOOP
                RET 
DEC        DS 1
                END

1 行目は,今回作成した一連の手続きを "SAMPLE" という名称で呼び出せるようにしている。

2 行目は GR0 という汎用レジスタに 16 進数で 0030 と表される数を格納している。
CASL II では 10 進数は普通の数字,16 進数は # を最初に付けた 4 桁の数字で表す。
LD は LoaD である。
また,#0030 の前に = がついているのは,それがリテラル(即値)と呼ばれるもので,GR0 に #0030 番地の内容を読み込むのではなく,#0030 という数値を直に読み込ませるためのオマジナイである。

3 行目は GR0 に 1 を加える操作を表す。ADDA は算術加算 (ADD Arithmetic) で,ここでもアドレス 1 番地の内容を GR0 に加えるという意味ではなく,リテラルを用いて GR0 の値を 1 だけ増やしている。

4 行目は GR0 に,9 行目に DEC というラベルを付け,DS (Define Storage?) 命令により 1 語(16 ビット)分の領域を確保しておいたところに GR0 の内容を一時保存 (STore) している。

5 行目の OUT 命令はマクロ命令の一つで,公式の仕様で細かい規定はそれほどなされていないが,第一オペランドに記されたラベルの内容を,第二オペランドで指定された語数分だけ標準出力に出力することを指示している。これにより,シミュレータによっては出力表示部に DEC 内に格納された 16 進数に対応する文字コードの文字を 1 文字表示する。

6 行目において GR0 の内容が #0039 という 16 進数より小さいかどうかを比較している。GR0 の内容の最下位の数がちょうど表示したい 1 から 9 までの数に対応している。
そして,#0031 が文字 '1' の符号に相当し,#0039 が '9' の符号に相当するので,カウンタ変数として使用している GR0 にあらかじめ #0030 というゲタを履かせておいて,その最下位のところを 1 から 9 まで数えるカウンタの記録用紙として使用し,GR0 の内容をそのまま表示したい数字の文字コードとして使用できるようにしてある。

6 行目の判定結果が負になった場合,すなわち,GR0 が #0039 よりも小さければ,カウンタの値は 1 から 8 までのいずれかであるから,ラベル LOOP を付した 3 行目に戻って作業を繰り返す。

判定結果が初めて負でなければ,GR0 の値はちょうど #0039 に等しく,数字 9 の表示を終えたところであるから,7 行目の JMI (Jump on MInus) は実行されず,その次の 8 行目の RET 命令が実行され,実質的にこの一連のプログラムの実行は完了する。


このようにすると,カウンタ変数を 2 進表示から 10 進表示に変換する手間を省くことができる。だが,1 から 99 までの数字を表示するという次の段階のプログラムとの間の溝はそこそこ深いように思われる。

次回はその課題について考えたいと考えている。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Peano の Principia Arithmet... | トップ | イプシロンではなくてエプシ... »
最新の画像もっと見る

コメントを投稿

情報系」カテゴリの最新記事