こんにちは、コンスキです。
今回は、CASLⅡにおいて以上や以下という条件を使って分岐する方法についてです。
「以上」や「以下」を表す分岐命令はない…けれど
CASLⅡには、A≧Bの時やA≦Bの時に分岐したい場合に使える命令が標準では存在しません。
CPA命令を使って比較をした後に、主に次の4つの分岐命令を使って指定した場所にジャンプすることがあると思います。
命令 | オペランド | OF | SF | ZF | ジャンプ要件 |
---|---|---|---|---|---|
JPL | adr [,x] | / | 0 | 0 | 直前の演算結果が 正数 のとき |
JMI | adr [,x] | / | 1 | / | 直前の演算結果が 負数 のとき |
JNZ | adr [,x] | / | / | 0 | 直前の演算結果が 0以外 のとき |
JZE | adr [,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である時にジャンプする」という風に書いてください。
コメント