CASL U - プログラミングの基礎(分岐命令) |
![]() ![]() ![]() |
(3) 分岐命令 入出力命令
分岐(ジャンプ)命令にはFRに設定された値によって、すなわち一定の条件によってジャンプする命令と無条件にジャンプする命令がある。
JPL(Jump on PLus, 正分岐)、JMI(Jump on MInus, 負分岐)、JNZ(Jump on Non Zero, 非零分岐)、JZE(Jump on ZEro, 零分岐)、JOV(Jump on OVerflow, オーバフロー分岐)、JUMP(unconditional JUMP, 無条件分岐)
命令 オペランド 分岐するときの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] 無関係 なし
入出力命令はマクロ命令として用意されている。入力装置から文字データを入力するIN命令と出力装置へ文字データを出力するOUT命令がある。一般的には、入力装置はキーボード、出力装置はディスプレイと考えればよい。
BUFF→Buffer:バッファ。データを一時的にためておく記憶領域。緩衝記憶装置という。
命令例 動作 IN BUFF, LEN 入力装置から入力された文字データをBUFF番地から1文字ずつ格納する。
LEN番地には文字数が格納される。
入力領域はBUFF番地から256語分用意する。256文字を超える文字データは無視される。OUT BUFF, LEN BUFF番地から順に格納された文字データをLEN番地に格納された値だけ出力装置へ出力する。
文字データの上位8ビットはOSによって無視される。出力しようとする文字数(≧0)は2進数で格納しておく。
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,2017 Hiroshi Masuda |