分岐を使うプログラム

24.4.4. 分岐を使うプログラム

分岐を使うと,より複雑な計算を行えます.例として絶対値を計算します.

分岐命令 #

分岐に関する主な命令に,以下があります.

BRA n
無条件でn番地にジャンプ
BRP n
“ACCUMULATOR"の値が非負(正またはゼロ)のときにn番地にジャンプ
BRZ n
“ACCUMULATOR"の値がゼロのときにn番地にジャンプ
BR は branch,A は always, P は positive, Z は zero の先頭文字とつなげると,認識しやすいです.
通常の実行ではプログラムカウンタの値は1ずつ増えますが,ジャンプ実行時は指定の値 (n) になります

プログラムの入力 #

絶対値を計算する例題プログラムを,プログラム領域にコピー&ペーストして,“Submit"ボタンを押して,メインメモリに読み込んでください.2行目の BRP 3 が分岐です

SUB 5
BRP 3
HLT
STA 5
HLT
DAT -5

“STEP"によるプログラムの実行 #

ここでも"STEP"をクリックして1命令ずつ実行して行きます.最初の状態では"PROGRAM COUNTER"と"ACCUMURATOR"の値は,ともに「0」となっています.

“SUB 4” の実行 #

0番地の命令は “205 (SUB 5)” です.SUB命令は

SUB n
n番地の値を"ACCUMULATOR"の値から引く

という命令ですから,“ACCUMULATOR” の初期状態の値「0」から5番地の値である「-5」を 引いて,結果の「5」を"ACCUMULATOR"に格納します.

“BRP 3” による条件つきのジャンプ #

1番地の命令は “803 (BRP 3)” です.BRP命令は

BRP n
“ACCUMULATOR"の値が正または0の時に,“PROGRAM COUNTER"の値をnにする(プログラムの実行をn番地にジャンプする)

という命令です.ここでは “ACCUMULATOR” の値は「5」で正ですから,“PROGRAM COUNTER"の値が「3」になります.

仮に(5番地の値が正で)“ACCUMULATOR” の値が負になった場合は, “PROGRAM COUNTER” の値は1つ増えて「2」になります.

“STA 5” の実行 #

3番地の命令は “305 (STA 5)” です.したがって,“ACCUMULATOR” の値「5」をメインメモリの5番地に書き出します.

“HLT” によるプログラムの終了 #

3番地の命令は “000 (HLT)” です.HLT命令によって,プログラムが終了します.このとき5番地に格納されている値「5」は、プログラム開始時の5番地の値「-5」の絶対値となっています.
プログラムが終了しました.

“RESET"によるプログラムの再実行 #

“RESET"をクリックしてから,プログラムを再度実行してみましょう. RESET 直後には,

  • “PROGRAM COUNTER"と"ACCUMURATOR"の値は,ともに「0」に戻っています.
  • 一方し,メインメモリの5番地は変わっています.元々のプログラムでは「-5」でしたが,1回実行したため「5」に書き換えられています.

ここから"STEP"で1命令ずつ実行してみましょう.

“SUB 4” の実行 #

0番地の命令は “205 (SUB 5)” です.“ACCUMULATOR” の初期状態の値「0」から5番地の値である「5」を引いて,結果の「-5」が"ACCUMULATOR"に格納されます.

“BRP 3” による条件つきのジャンプ #

1番地の命令は “803 (BRP 3)” です.ここでは “ACCUMULATOR” の値は「-5」ですから,今回は"PROGRAM COUNTER"の値は「3」には書き換えられずに「2」となります.

“HLT” によるプログラムの終了 #

2番地の命令は “000 (HLT)” です.HLT命令によって,プログラムが終了します.

プログラムの終了時には,以下のようになります.

終了時に5番地に格納されている値「5」は、プログラム開始時の4番地の値「5」の絶対値となっています.
プログラムの書き換え 分岐を使うプログラム 反復処理
このサイトは開発版の はいぱーワークブック です.