ジャンプ命令(分岐命令)

ここまでのプログラムは、アドレスの順番に記述されている命令を単純に実行するものでした。プログラムを効率良く記述したり、高度な処理を実現するには、命令の実行順序を制御する必要があります。

CPUが次に実効する命令のアドレスはプログラムレジスタPRに格納されています。これは1つの命令を実行すると、自動的に次の命令のアドレスを指すようになっています。PRを値を途中で変更してやることにより、プログラムの流れを制御することができます。

また種々の条件によって、実行する内容を変更したい場合があります。このような処理を記述するのにも、分岐命令が必要です。


ジャンプ命令の書き方

ジャンプ命令には6種類(JUMP, JPL, JMI, JNZ, JZE, JOV)ありますが、基本的に書き方は共通です。すなわち、

命令コード 実効アドレス

このように、ジャンプの種類を示す命令コードと、ジャンプ先のアドレスを示す実効アドレスの組み合わせです。


実効アドレス

具体的なジャンプ先を指定するのが実効アドレスです。これには、色々な記述方法が考えられます。

絶対アドレスの指定

主記憶の特定の絶対アドレスを直接定数で指定します。

JUMP 1100

この例では、無条件に1100番地にジャンプします。絶対アドレスの指定はプログラムの可搬性を損なうため、一般的ではありません。

ラベルによる指定

ジャンプ先をラベルで指定する方法です。よく用いられます。

JUMP PRC1

この例では、ラベル PRC1 へジャンプします。

指標レジスタによるジャンプ先の指定

ジャンプ先を指標レジスタで指定することもできます。

JUMP 0,GR7

この例では、GR7に格納されたアドレスにジャンプします。

この他、絶対アドレスと指標レジスタの組み合わせ と、ラベルと指標レジスタの組み合わせ が、可能です。


ジャンプ命令

無条件分岐 (unconditional jump)

命令コード:JUMP

無条件にプログラムレジスタPRに実効アドレス値を代入します。すなわち、プログラムは無条件に実効アドレスにジャンプします。JUMPは何の条件も無くジャンプしますが、これ以外の全てのジャンプ命令は、特定の条件においてジャンプします。無条件ジャンプ以外のジャンプを条件付きジャンプといいます。

正分岐 (jump on pluse)

命令コード:JPL

SF = 0 で、かつ ZF = 0 のときに、実効アドレスにジャンプします。

負分岐 (jump on minus)

命令コード:JMI

SF = 1 のときにジャンプします。

非零分岐 (jump on non zero)

命令コード:JNZ

ZF = 0 のときにジャンプします。

零分岐 (jump on zero)

命令コード:JZE

ZF = 1 のときにジャンプします。

オーバーフロー分岐 (jump on overflow)

命令コード:JOV

OF = 1 のときにジャンプします。


ジャンプ命令とフラグの関係

名前 命令 OF SF ZF
無条件分岐 JUMP - - -
正分岐 JPL - 0 0
負分岐 JMI - 1 -
非零分岐 JNZ - - 0
零分岐 JZE - - 1
オーバーフロー分岐 JOV 1 - -