next up previous contents index
Next: 高水準プログラム言語における分岐/ジャンプ Up: プログラム Previous: プログラム   Contents   Index

命令の種類

高水準プログラム言語では,1行の中にいろいろな作業を含ませることが可能であるが, 機械語の命令のレベルになると,各命令は単純なことしかできない。 そもそも,コンピュータは計算機械から出発し,その構造も前章に示したように, データ処理部と呼ばれる計算に特化した部分と, それを動かす制御部からなっていることからわかるように, 大部分の命令は演算命令(arithmetic instruction)と呼ばれる計算のためのものである。

四則演算の手続きから想像できるものに加え,次のようなものが考えられる。 なお,下記文章で,レジスタ(register)とはCPU内部の一時メモリーのことである。

こうしたレジスタの内容は,元をたどると,周辺装置から持ってくることが多い。 また,各計算過程における中間結果はレジスタ上に置かれるが, 最終的には周辺装置に移動され,始めてユーザの目に触れることになる。

より複雑な計算で,中間結果が極めて多くなると, それらデータを外部に置かれたメモリーに置き, それを必要に応じ,レジスタに読み込んで計算を行う。 あるいは,表計算のようなものでは, 周辺装置の一つであるハードディスクから表全体をメモリーへ移動し, そこから必要な部分だけをレジスタへ移動して計算し, 計算結果を元のメモリー上の表へ戻すことが行われる。 いずれにせよ, 周辺装置を含め,外部メモリーとレジスタ間のデータのやり取りが必要である。 そこで,外部メモリーや周辺装置とのデータの移動を目的として, 移動命令(move instruction)と呼ばれる次のような命令が必要である。

CPUによっては, これら二つのカテゴリーの命令の混ざったものを実行する命令を備えたものもある。 例えば, レジスタの内容と外部メモリー上のデータを直接加算する命令などである。 本書では,外部メモリーとのやり取りは,レジスタとの移動に限り, 各種算術演算はレジスタ間でしか行わないこととした。

これだけの命令で基本的な動作はできそうであるが, 多くのプログラムではジャンプ命令(jump instruction)というものを多用する。 機械語で書かれた命令は,通常メモリー上に置かれる。 それも原理的には,メモリーの1アドレスに1命令が書かれ,さらに, これらの命令は低アドレス側から高アドレス側に順に実行されると考えてよい。 このように, アドレスの順に実行されるプログラムのことを逐次プログラム(sequential program)と言う。

しかし,メモリー上には命令とデータが混載されていることが多い。 したがって,命令の書かれた領域がいくつかに分かれているときなどには, 命令領域の最後に,次の命令の書かれている領域にジャンプできるような ジャンプ命令を記載することが必要となる。 また,条件によって,実行することを変えたいときにもジャンプ命令が必要である。 さらには,いくつかのデータの総和を計算するようなとき, メモリーからデータをレジスタに移動することと, その内容を次から次に合計値に加算していくといった同じ動作の繰り返しが必要となる。 こうしたときにも繰り返しを行うためのジャンプ命令が必要である。 この場合,放っておくと,永久に同じ命令領域を繰り返すことになるので, 何らかのきっかけで,ジャンプを停止し,繰り返しを終了することが必要となる。 こうした条件によりジャンプ先が異なるようなジャンプ命令は 分岐(branch)命令とも呼ばれる。

本書では,ジャンプ先が常に決まっているジャンプを無条件ジャンプ(unconditional jump), 条件によりジャンプ先が異なるジャンプを条件ジャンプ(conditional jump)と呼ぼう。 条件ジャンプとは,条件が真の場合は次のアドレスを実行するが, 偽の場合には指定されたアドレスにジャンプ(jump)する。 このような条件ジャンプの条件は, 図 7.3に示したALUからのフラグ(flag)を利用する。

例えば1から$i$までの連続した整数の合計を計算するようなときは, 次のように,条件ジャンプを利用する。

  1. あるレジスタAを累計用とし,それに0を入れる。
  2. 別のあるレジスタBに最大数$i$を入れる。
  3. レジスタAとBの和を計算し,結果をAに入れる。
  4. Bの内容を1減らす。Bが0でなければ1行前へジャンプする。
  5. Aは総和となる。
この下から2行目が条件ジャンプであり, 非ゼロフラグ(結果が0でないときに立つフラグ)を検知してジャンプする。 フラグが0のときには,次の行へ移動する。


next up previous contents index
Next: 高水準プログラム言語における分岐/ジャンプ Up: プログラム Previous: プログラム   Contents   Index
Yoichi OKABE 2008-03-29