例題の解説

・ 2進数の表示に関して確認してみよう。全体の流れは次のようになる。

0.初期設定 ループカウンタ兼表示位置に対応する定数(GR3)を15に。(16桁の2進数)
1.最下位1ビットが1か0の判定を行う。(1(=#0001)とのアンドを取る)
2.1or0の文字コードを計算。GR1に'0'の文字コードを論理加算することで1または0の文字コードを得る。
3.最下位ビットの表示位置(OUTBUF+15)に上で計算した文字コードを格納
4.DATA02を1ビット右にシフト,表示位置を一つ左に(GR3=GR3-1)。1.へ
 

DATA02が6(=110)の場合の処理過程の一部

;-------------------------
; 例4 2進数の印刷
;------------------------
EX4	START
	LAD	GR3,15          ;ループのカウンタの初期化(GR3 ← 15)
	LD	GR1,DATA02      ;GR1 ← (DATA02)
LOOP	LAD	GR2,0,GR1       ;GR1をGR2に退避
	AND	GR1,HEX01       ;GR1と#0001との論理積を取る
	ADDL	GR1,ZONE        ;'0'との論理加算により文字コードを得る
	ST	GR1,OUTBUF,GR3  ;GR1を(OUTBUF+GR3)番地にストア
	LAD	GR1,0,GR2       ;GR1を復元
	SRL	GR1,1           ;GR1を1ビット論理右シフト
	LAD	GR3,-1,GR3      ;GR3 ← -1 + GR3
	CPA	GR3,ZERO        ;GR3と0を算術比較
	JPL	LOOP            ;GR3 > 0 ならLOOPへ
	JZE	LOOP            ;GR3 = 0 ならLOOPへ
	OUT	OUTBUF,OUTLEN   ;文字を出力
	RET
DATA02	DC	25              ;←適当に変えてみる
HEX01	DC	#0001
ZONE	DC	'0'
ZERO	DC	0
OUTBUF	DS	16
OUTLEN	DC	16
	END	

 

・ 10進数は?

10進数は上二つの方法はとれないので,次のように考える。

1.GR1(=DATA10)から10000を何回引くと負になるかを求める。n回で負になったらそのnが万の位の値
2.nの文字コードを適当な位置に設定
3.GR1は-????という4桁(正確には4桁以下)の負の数になっているので10000を足し,4桁の正の数にする。
4.引く数を1000,100,10,1に変えて上記の手順を繰り返す。
※2進数,16進数の場合は下位の桁から順に求めていたが,10進数の場合には上位桁から求めている点に注意する。
;----------------------
; 例6 10進数の印刷
;----------------------
EX6     START
        LD      GR1,DATA10      ;データをGR1にセット
        LAD     GR3,0           ;文字列を数えるカウンタ
LOOP1   LAD     GR2,-1          ;商の設定
LOOP2   LAD     GR2,1,GR2       ;GR2 ← 1 + GR2
        SUBA    GR1,C10X,GR3    ;GR1 ← (GR1)-(C10X+GR3)
        JPL     LOOP2           ;減算結果が >0 ならばLOOP2へ
        JZE     LOOP2           ;減算結果が =0 ならばLOOP2へ
        ADDA    GR1,C10X,GR3    ;GR1が負になっているので(C10X + GR3)番地のデータを加算
        ADDL    GR2,ZONE        ;GR2と'0'との論理加算により文字コードを得る
        ST      GR2,OUTBUF,GR3  ;GR2を(OUTBUF+GR3)番地にストア
        LAD     GR3,1,GR3       ;GR3 ← 1 + GR3
        CPA     GR3,F5          ;GR3と5を算術比較
        JMI     LOOP1           ;GR3 < 0 ならLOOP1へ
        OUT     OUTBUF,OUTLEN   ;文字を出力
        RET
DATA10  DC      23542               ;←適当に変えてみる
C10X    DC      10000,1000,100,10,1 ;連続領域
ZONE    DC      '0'
OUTBUF  DS      5
OUTLEN  DC      5
F5      DC      5
        END	

戻る