C言語やJavaなどでは,if文やfor文で条件分岐や繰り返しの処理を記述します。でもアセンブラには,それらに相当する命令がありません。比較命令とジャンプ命令を組み合わせてプログラムの流れを制御しているのです。

矢沢 久雄グレープシティ

なんでキャット(以下,キャット):前回は,アセンブラの命令の種類を紹介したけど,分かってもらえたかニャ?

Tデスク:はい。命令の種類が少ないので,とても簡単でした。でも,ちょっと不思議だなぁと感じたことがあります。

キャット:なんだニャ?

Tデスク:C言語やJavaには,条件分岐の流れを作るためにif文やswitch文があり,繰り返しの流れを作るためにfor文やwhile文がありますよね。アセンブラの命令の中には,それに相当するものが見当たらないようですが…。

キャット:アセンブラには,1つの命令だけで条件分岐や繰り返しを実現するものはないんだニャ。

Tデスク:ええっ! それでは,どうやって条件分岐や繰り返しを実現するのですか?

キャット:比較命令とジャンプ命令を組み合わせるんだニャ。

Tデスク:1つの行に2つの命令を書いちゃうのですか?

キャット:違う,違う。まずCPA命令またはCPL命令で比較を行って,次に比較結果に応じてJPL命令やJMI命令などで特定の行にジャンプするんだ。ジャンプ先の行には,ラベルを付けておくニャ。

Tデスク:比較命令とジャンプ命令で2行になるのですね。

キャット:その通りだニャ。

Tデスク:繰り返しの場合はどうなりますか?

キャット:手順は,条件分岐と同じだニャ。ジャンプ先を前の行にすれば,同じ処理を繰り返すことになるニャ。

Tデスク:ということは,条件分岐も繰り返しも,コンピュータの生の動作としては比較とジャンプで実現されているのですね。

キャット:それが本当のプログラムの流れというものだニャ。

Tデスク:でも,高水準言語は1つの命令で済んでしまいますよ。

キャット:高水準言語のif文やfor文もコンパイルすると,比較命令とジャンプ命令を組み合わせたマシン語になるんだニャ(図1)。

図1●「条件分岐」や「繰り返し」は比較命令とジャンプ命令で実現する
図1●「条件分岐」や「繰り返し」は比較命令とジャンプ命令で実現する

Tデスク:なるほどねぇ。

キャット:もっと詳しく知りたいかニャ?

Tデスク:ぜひ,教えてください(またまたカツオブシを差し出す)!

キャット:OK! OK! 任せてちょうだいニャ!

比較してジャンプする

 第1回で説明したCOMETIIのCPUのレジスタ構成を思い出してほしい(図2)。全部で8つある汎用レジスタGR0~GR7には,演算の対象となるデータを格納したり,データやプログラムが記憶されたメモリのアドレスを格納する。スタックポインタ(SP)には,スタック領域の最上段のアドレスが設定される。

図2●COMETIIのCPUのレジスタ構成
図2●COMETIIのCPUのレジスタ構成
プログラムレジスタ(PR)とフラグレジスタ(FR)がプログラムの流れを制御する

 今回注目してほしいのは,プログラムレジスタ(PR)とフラグレジスタ(FR)の役割である。PRには,現在実行している命令の次に実行する命令のアドレスが設定される。

 最初にディスクからメモリにプログラムをロードすると,プログラムの先頭の命令のアドレスがPRに設定される。その命令の実行が終わると,PRの値は自動的にインクリメントされて,次の命令が格納されたアドレスとなる。その後も同様にして,プログラムの命令が順番に実行されていく。これによって,「順次進行(命令が並んだ順番通りに,上から下に向かって実行されること)」というプログラムの流れが実現される。

 「条件分岐」や「繰り返し」といった順次進行以外の流れを実現したい場合,すなわち順番通りではなく特定の行に処理の流れを変えたい場合は,JPL命令やJMI命令などの各種のジャンプ命令を使う。ジャンプ命令では,「JPL LABEL1」や「JMI JABEL2」のように,オペランドにジャンプ先の行のラベルを指定する。ラベルは,その行のアドレスを意味する。ジャンプ命令を実行すると,ラベルが意味するアドレスがPRレジスタに設定され,プログラムの流れが変わる。ジャンプ命令は,PRの値を間接的に設定するものなのだ。