• 検索結果がありません。

第 9 章 サブルーチン 59

12.4 文字列から整数への変換

12.4. 文字列から整数への変換 83

;

HEXVAL CPL GR2,=’A’

JMI SKIP1 SUBL GR2,=55 JUMP SKIP2 SKIP1 SUBL GR2,=48 SKIP2 RET

;

INAREA DS 256 INLENGTH DS 1 INTEGER DS 1

DUMPE DC -1

MSG DC ’MESSAGE1’

END

このプログラムは、文字列を読み込んで、その文字列を16進数として解釈したときにそれが表 現している整数を求めて、その整数が格納されている主記憶装置の語をDMEM命令で表示します。

H2ISUBから始まるサブルーチンは、INAREAから始まる領域に格納されている16進数を解釈 して、それが表現している整数をINTEGERに格納します。

LOOPから始まるループは、GR0を左へ4ビットずつ論理シフトしながら、16進数を構成して いるそれぞれの文字について、それが表現している整数とGR0との論理和をGR0に設定する、と いうことを繰り返します

HEXVALから始まるサブルーチンは、GR2に格納されている文字を、16進数の数字と解釈して、

それが表現している整数をGR2に設定します。

実行例 IN ? BD6

* MESSAGE1 * Start:012A End:012B

0128: ---- ---- 0BD6 FFFF ---- ---- ---- ---- ..

12.4.3 10進数の文字列から整数への変換

次に、10進数の文字列を整数に変換するプログラムを書いてみましょう。

プログラムの例 dec2int.cas DEC2INT START

IN INAREA,INLENGTH CALL D2ISUB

DMEM MSG,INTEGER,DUMPE RET

;

D2ISUB LAD GR0,0 LAD GR1,0 LOOP1 CALL TENTIMES

LD GR2,INAREA,GR1 SUBL GR2,=48

ADDL GR0,GR2 LAD GR1,1,GR1 CPL GR1,INLENGTH JMI LOOP1

ST GR0,INTEGER RET

;

TENTIMES LAD GR3,0 LD GR4,GR0 LOOP2 ADDL GR0,GR4

LAD GR3,1,GR3 CPL GR3,=9 JMI LOOP2 RET

;

INAREA DS 256 INLENGTH DS 1 INTEGER DS 1

DUMPE DC -1

MSG DC ’MESSAGE1’

END

このプログラムは、文字列を読み込んで、その文字列を10進数として解釈したときにそれが表 現している整数を求めて、その整数が格納されている主記憶装置の語をDMEM命令で表示します。

D2ISUBから始まるサブルーチンは、INAREAから始まる領域に格納されている10進数を解釈 して、それが表現している整数をINTEGERに格納します。

LOOPから始まるループは、GR0を10倍しながら、10進数を構成しているそれぞれの文字につ いて、それが表現している整数とGR0とを加算した結果をGR0に設定する、ということを繰り返 します

TENTIMESから始まるサブルーチンは、GR0に格納されている整数を10倍した結果をGR0に設 定します。

実行例 IN ? 3030

* MESSAGE1 * Start:012A End:012B

0128: ---- ---- 0BD6 FFFF ---- ---- ---- ---- ..

13 章 再帰

13.1 再帰の基礎

13.1.1 再帰とは何か

この章では、「再帰」(recursion)と呼ばれるものを使ったプログラムの書き方について説明し たいと思います。

再帰というのは、全体と同じものが一部分として含まれているという性質のことです。再帰と いう性質を持っているものは、「再帰的な」(recursive)と形容されます。

ここに、1台のカメラと1台のモニターがあるとします。まず、それらを接続して、カメラで 撮影した映像がモニターに映し出されるようにします。そして次に、カメラをモニターの画面に 向けます。すると、モニターの画面には、そのモニター自身が映し出されることになります。そ して、映し出されたモニターの画面の中には、さらにモニター自身が映し出されています。この ときにモニターの画面に映し出されるのは、再帰という性質を持っている映像、つまり再帰的な 映像です。

また、先祖と子孫の関係も再帰的です。なぜなら、先祖と子孫との中間にいる人々も、やはり 先祖と子孫の関係で結ばれているからです。

13.1.2 基底

再帰という性質を持っているものは、全体と同じものが一部分として含まれているわけですが、

その構造は、内部に向かってどこまでも続いている場合もあれば、どこかで終わっている場合も あります。

再帰的な構造がどこかで終わっている場合、その中心には、その内部に再帰的な構造を持って いない何かがあります。そのような、再帰的な構造の中心にあって、その内部に再帰的な構造を 持っていないものは、その再帰的な構造の「基底」(basis)と呼ばれます。

先祖と子孫の関係では、親子関係というのが、その再帰的な構造の基底になります。

13.1.3 再帰的なサブルーチン

サブルーチンは、再帰的に書くことが可能です。サブルーチンを再帰的に書くというのは、自 分の中で自分自身を呼び出すサブルーチンを書くということです。再帰的な構造を持っている概 念を取り扱うサブルーチンは、再帰的に書くほうが、再帰的ではない方法で書くよりもすっきり した記述になります。

サブルーチンを再帰的に書く場合は、基底に到達しているかどうかを判断して、もしも基底に 到達していた場合は、自分自身を呼び出さないで終了する、ということが必要になります。基底 に到達している場合も自分自身を呼び出すように書いたとすると、そのサブルーチンは、無限に 自分自身を呼び出し続けることになってしまいます。