前のページでフラグレジスタの変化を確認しました。
このプラグレジスタを使うことで、条件により分岐ができるようになります。
以下に分岐命令の種類をまとめます。
(右のフラグレジスタ(OF,SF,ZF)の状態の時にアドレスの命令に移動します。)
| 意味 | ニーモニック | OF | SF | ZF |
|---|---|---|---|---|
| 正分岐(Jump on PLus) | JPL adr [,x] | 0 | 0 | |
| 負分岐(Jump on MInus) | JMI adr [,x] | 1 | ||
| 非ゼロ分岐(Jump on Non Zero) | JNZ adr [,x] | 0 | ||
| ゼロ分岐(Jump on Zero) | JZE adr [,x] | 1 | ||
| オーバーフロー分岐(Jump on OVerflow) | JOV adr [,x] | 1 | ||
| 無条件分岐(unconditional Jump) | JUMP adr [,x] |
フラグ欄で 空欄 は、判定に使われません。0か1の記述があるフラグ状態で、オペランドのアドレスに実行が移動します。
例えば、JPL LOOP は、SFとZFが共に0の時だけLOOPの実行位置に移動しますが、そうでないフラグの状態では何もせずに次の命令に進みます。
例えば、JOV J1 は、OF(Overflow Flag)が1の場合だけJ1のラベル位置に移動します。
次の例では、ADDA GR2, GR1 の演算(Yの演算)で、誤った演算(アンダーフロー)を行うまで繰り返すプログラム例です。
(実験で、プログラムに意味はありません。Yに負を加算するL1のループになっていますが、JOVによりエラーで終了しています。)
問題 前ページの Yに3+2+1の6が記憶され、Xに-1が記憶されて終わるプログラムは、
以下のC言語に相当するプログラムのような繰り返し構造で簡単にできます。
上記のプログラムを対応するアセンブラに変更してみまよう。(なお、ほとんど変更されます)
←わからない場合は、クリック
short int K;
short int X = 3;
short int Y;
main()
{
K = -1;
do {
Y += X;
X = X + K;
} while( X >= 0);
}