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

第 9 章 サブルーチン 59

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

12.3. 整数から文字列への変換 79

INT2BIN START

LD GR0,INTEGER LAD GR1,15 LOOP SRL GR0,1

JOV SKIP1 LD GR2,=’0’

JUMP SKIP2 SKIP1 LD GR2,=’1’

SKIP2 ST GR2,BINARY,GR1 LAD GR1,-1,GR1 CPA GR1,=-1 JPL LOOP

OUT BINARY,LENGTH RET

;

INTEGER DC #39CE BINARY DS 16 LENGTH DC 16

END

このプログラムは、INTEGER番地に格納されている、#39CEという整数を2進数の文字列に 変換して、その結果を出力します。実行すると、

0011100111001110 と出力されるはずです。

変換の結果は、BINARYから始まる領域に格納されます。GR1は、文字をストアする位置を示 すインデックスレジスターとして使われています。0をストアするか1をストアするかというこ とは、GR0にロードされた整数を右へ1ビットだけ論理シフトすることによって判断しています。

シフト命令は、最後に送り出されたビットをオーバーフローフラグに設定しますので、その直後 にJOV命令を実行すると、1が送り出された場合は分岐して、0が送り出された場合は分岐しま せん。

12.3.2 整数から16進数の文字列への変換

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

プログラムの例 int2hex.cas INT2HEX START

LD GR0,INTEGER LAD GR1,3 LOOP LD GR2,GR0

AND GR2,=#000F CPL GR2,=10 JMI SKIP1 ADDL GR2,=55 JUMP SKIP2 SKIP1 ADDL GR2,=48

SKIP2 ST GR2,HEXDEC,GR1 SRL GR0,4

LAD GR1,-1,GR1 CPA GR1,=-1 JPL LOOP

OUT HEXDEC,LENGTH RET

;

INTEGER DC #39CE HEXDEC DS 4 LENGTH DC 4

END

このプログラムは、INTEGER番地に格納されている、#39CEという整数を16進数の文字列に 変換して、その結果を出力します。実行すると、

39CE

と出力されるはずです。

整数を16進数の文字列に変換するための考え方は、2進数の文字列へ変換する場合と、基本 的には同じです。16進数というのは、2進数を4桁ずつ区切って、それぞれの4桁を1文字で表 記したもののことです。したがって、2進数の文字列への変換では1ビットずつ右シフトしてい

12.3. 整数から文字列への変換 81 たところを、4ビットずつ右シフトして、右端の4桁を文字に変換していけばいいということに なります。

2進数の文字列への変換では、シフト命令によって最後に送り出されたビットがオーバーフロー フラグに設定されることを利用して、文字が0なのか1なのかということを判断したわけですが、

16進数の文字列への変換では、この方法は使えません。そこで、このプログラムでは、

0000 0000 0000 1111

というマスクとの論理積を求めることによって、右端の4ビットを取り出しています。

JIS X 0201では、0、1、2、3、……という文字は、それと同じ順番で、48、49、50、51、……

という連続した整数によってあらわされます。ですから、0から9までの整数は、それに48を 加算することによって、文字に変換することができます。

16進数では、桁の数値が10から15までの場合、それは、A、B、C、D、E、Fという英字に よって表記されます。JIS X 0201では、A、B、C、D、……という英字の大文字は、それと同じ 順番で、65、66、67、68、……という連続した整数によってあらわされますので、10から15ま での整数は、それに55を加算することによって、文字に変換することができます。

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

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

プログラムの例 int2dec.cas INT2DEC START

LD GR0,INTEGER LAD GR1,0 LOOP1 CALL DIVIDE

ADDL GR2,=48

ST GR2,DECIMAL,GR1 LAD GR1,1,GR1 CPA GR1,=4 JMI LOOP1 ADDL GR0,=48

ST GR0,DECIMAL,GR1 OUT DECIMAL,LENGTH RET

;

DIVIDE LAD GR2,0

LOOP2 CPA GR0,WEIGHT,GR1 JMI EXIT

LAD GR2,1,GR2 SUBL GR0,WEIGHT,GR1 JUMP LOOP2

EXIT RET

;

INTEGER DC #39CE

WEIGHT DC 10000,1000,100,10 DECIMAL DS 5

LENGTH DC 5 END

このプログラムは、INTEGER番地に格納されている、#39CEという整数を10進数の文字列に 変換して、その結果を出力します。実行すると、

14798

と出力されるはずです。

このプログラムの考え方は、上で紹介した、整数を2進数や16進数の文字列に変換するプロ グラムの考え方とは、かなり異なっています。

整数をあらわす10進数のそれぞれの桁は、右から左へ順番に、100、101、102、……という重 みを持っています。そこで、WEIGHTから始まる4語の領域のそれぞれに、104、103、102、101 という、10進数の桁の重みを設定しておきます。

LOOP1から始まるループは、104の桁から順番に、桁の文字を求めて、それをDECIMALから始 まる領域にストアする、ということを繰り返します。そして、ループから脱出したのち、100の 桁の文字をストアします。

DIVIDEから始まるサブルーチンは、個々の桁があらわしている整数を求めます。GR0から桁

の重みを減算していって、減算の回数をGR2に求めます。