CASL U - プログラミングの基礎(分岐命令)
 前へ 目次へ 次へ

 (3) 分岐命令 入出力命令

 分岐(ジャンプ)命令にはFRに設定された値によって、すなわち一定の条件によってジャンプする命令と無条件にジャンプする命令がある。

命令 オペランド 分岐するときのFRの値  
OF SF ZF ジャンプ要件
JPL adr [,x] 0 0  / 直前の演算結果が 正数 のとき
JMI adr [,x] 1  / 直前の演算結果が 負数 のとき
JNZ adr [,x] 0 直前の演算結果が 0以外 のとき
JZE adr [,x] 1 直前の演算結果が 0 のとき
JOV adr [,x] 1 直前の演算結果で
 オーバーフロー、アンダーフローが起こった とき
JUMP adr [,x] 無関係 なし
JPL(Jump on PLus, 正分岐)、JMI(Jump on MInus, 負分岐)、JNZ(Jump on Non Zero, 非零分岐)、JZE(Jump on ZEro, 零分岐)、JOV(Jump on OVerflow, オーバフロー分岐)、JUMP(unconditional JUMP, 無条件分岐)

 入出力命令はマクロ命令として用意されている。入力装置から文字データを入力するIN命令と出力装置へ文字データを出力するOUT命令がある。一般的には、入力装置はキーボード、出力装置はディスプレイと考えればよい。

命令例 動作
IN  BUFF, LEN 入力装置から入力された文字データをBUFF番地から1文字ずつ格納する。
LEN番地には文字数が格納される。
入力領域はBUFF番地から256語分用意する。256文字を超える文字データは無視される。
OUT  BUFF, LEN BUFF番地から順に格納された文字データをLEN番地に格納された値だけ出力装置へ出力する。
文字データの上位8ビットはOSによって無視される。出力しようとする文字数(≧0)は2進数で格納しておく。
BUFF→Buffer:バッファ。データを一時的にためておく記憶領域。緩衝記憶装置という。
LEN→Length:長さ。


例題3-1 文字データを入力し、'A' であれば 'OK' 、それ以外のときは 'NO' と出力する。
 'A'の文字コードは#0041である。

入力文字と'A'が等しければジャンプする形のプログラム
EX31     START
         LD      GR0, ='A'
         IN      BUFF, LEN
         CPL     GR0, BUFF
         JZE     OK
         OUT     MSG2, MLEN
         JUMP    OWARI
OK       OUT     MSG1, MLEN
OWARI    RET
MSG1     DC      'OK'
MSG2     DC      'NO'
MLEN     DC      2
LEN      DS      1
BUFF     DS      256
         END
;
;比較元のデータをGR0に格納
;文字データ入力
;比較
;比較結果が同じであればOK番地へ
;'NO'と出力
;OWARI番地へ
;'OK'と出力
;OSに戻る
;出力データ
;出力データ
;出力文字数
;入力文字数格納領域
;入力文字格納領域

 2行目では元になる文字データをGR0に記憶している。
 3行目で文字データを入力している。入力された文字データはBUFF番地に、文字数はLEN番地に格納される。ラベルBUFFには256語長分、ラベルLENには1語長分の領域をDS命令で確保する。入力処理に必要な部分だけを次に示す。

         IN      BUFF, LEN
LEN      DS      1
BUFF     DS      256

 4行目でGR0の内容('A')と入力された文字データ(BUFF番地の内容)を比較している。同じであればFRのZF(ゼロフラグ)が1になる。5行目のJZE命令はZF = 1のときに実効アドレス(ここではOK番地)にジャンプする。OK番地ではラベルMSG1で定義されている文字データ('OK')が出力される。OK番地にジャンプしなければ次の番地(行)に進み、ラベルMSG2で定義されている文字データ('NO')が出力される。
 出力処理に必要な部分だけを次に示す。

         OUT     MSG2, MLEN
MSG2     DC      'NO'
MLEN     DC      2
−−−−−−−−−−−−−−−−−−−−−−−−−
OK       OUT     MSG1, MLEN
MSG1     DC      'OK'
MLEN     DC      2


[参考]入力文字と'A'が等しくなければジャンプする形のプログラム
EX31     START
         LD      GR0, ='A'
         IN      BUFF, LEN
         CPL     GR0, BUFF
         JNZ     NO
         OUT     MSG1, MLEN
         JUMP    OWARI
NO       OUT     MSG2, MLEN
OWARI    RET
MSG1     DC      'OK'
MSG2     DC      'NO'
MLEN     DC      2
LEN      DS      1
BUFF     DS      256
         END
;
;比較元のデータをGR0に格納
;文字データ入力
;比較
;比較結果が同じでなければNO番地へ
;'OK'と出力
;OWARI番地へ
;'NO'と出力
;OSに戻る
;出力データ
;出力データ
;出力文字数
;入力文字数格納領域
;入力文字格納領域


例題3-2 3+4+5+6+7+8+9 を計算する。計算結果はKOTAE番地に記憶する。

EX32     START
         LD      GR0, =0
         LD      GR1, =3
         LD      GR2, =7
LOOP     ADDA    GR0, GR1
         ADDA    GR1, =1
         SUBA    GR2, =1
         JPL     LOOP
         ST      GR0, KOTAE
         RET
KOTAE    DS      1
         END

 GR0には計算結果を記憶する。GR1には最初の3を記憶しておき、1ずつ加算して4,5,6,7,8,9のデータを作成する。GR2には加算の回数である7を記憶しておき、1ずつ減算して正数の間、繰り返すようにしている。
 ジャンプ命令JPLの前には2つのADDA命令とSUBA命令があるが直前のSUBA命令によって設定されたFRの値にしたがってジャンプするかどうかが判断される。
 計算結果は、2A(16)(42)である。


 前へ 目次へ 次へ
 CASL U Copyright © 2003  Hiroshi Masuda

 

 

inserted by FC2 system