【CASLⅡ】分岐命令で「以上」や「以下」という条件を使う

CASL2における以上や以下 プログラミング
Photo by Thomas T on Unsplash

こんにちは、コンスキです。

今回は、CASLⅡにおいて以上以下という条件を使って分岐する方法についてです。

「以上」や「以下」を表す分岐命令はない…けれど

CASLⅡには、A≧Bの時やA≦Bの時に分岐したい場合に使える命令が標準では存在しません。

CPA命令を使って比較をした後に、主に次の4つの分岐命令を使って指定した場所にジャンプすることがあると思います。

命令オペランドOFSFZFジャンプ要件
JPLadr [,x]0 0直前の演算結果が 正数 のとき
JMIadr [,x]1 /直前の演算結果が 負数 のとき
JNZadr [,x]0直前の演算結果が 0以外 のとき
JZEadr [,x]1直前の演算結果が 0 のとき

例えば、CPA命令が次のように使われたとすると

CPA A, B

A>Bの時にジャンプするためにはJPL
A<Bの時にジャンプするためにはJMI
A≠Bの時にジャンプするためにはJMI
A=Bの時にジャンプするためにはJMI

のようになることを意味しています。

しかし、この4つの中にはA≧Bの時やA≦Bの時に分岐したい場合に使える命令がありません。

【結論】考え方を変える

A≧Bではなく、「A>BまたはA=Bである時にジャンプする」という風に考えれば大丈夫です。

例えば、次のプログラムは5✖️4の掛け算です。

MAIN	 START	 
 	        LD GR1, X	 
 	        LD GR2, Y	 
 	        CALL CALC	        
 	        ST GR0, ANS	     
 	        RET	 
 	 	 
CALC       LAD GR0, 0
LOOP	ADDA GR0, GR1	 
 	        LAD GR2, -1, GR2	 
 	        CPA GR2, =0	        ;かける数と0を比較
 	        JPL LOOP	         ;かける数が0より大きいならLOOPに移動
 	        RET	 
 	 	 
X	         DC 5	 ;かけられる数
Y	         DC 4	 ;かける数
ANS	         DS 1	 ;積
 	         END	 

5を4回足すという方法で掛け算をしています。

ループを一周するごとにかける数である4から1が引かれていき、かける数が0よりも大きい間だけループを回すというものです。

最終的に変数ANSに入るのは20になります。

これを、かける数が0以上の間だけループを回すという条件に変えてみましょう。

MAIN	 START	 
 	        LD GR1, X	 
 	        LD GR2, Y	 
 	        CALL CALC	        
 	        ST GR0, ANS	     
 	        RET	 
 	 	 
CALC       LAD GR0, 0
LOOP	ADDA GR0, GR1	 
 	        LAD GR2, -1, GR2	 
 	        CPA GR2, =0	        ;かける数と0を比較
 	        JPL LOOP	         ;かける数が0より大きいならLOOPに移動
               JZE  LOOP                ;かける数が0ちょうどの時でもLOOPに移動
 	        RET	 
 	 	 
X	         DC 5	 ;かけられる数
Y	         DC 4	 ;かける数
ANS	         DS 1	 ;積
 	         END	 

上のプログラムではX>Yの時だけジャンプするJPL命令に加えて、X=Yの時にジャンプJZE命令を書きました。

これで、X≧Yの時にLOOPに移動するようになります。

ループを回るのが1周増えるため答えは25になります。

〜以下という条件を作ってジャンプしたい時でも要領は同じです。

A<BまたはA=Bである時にジャンプする」という風に書いてください。

コメント

タイトルとURLをコピーしました