植物 植物
初心者講座:比較演算命令

AOBA's Information Processing Education



1998/03/29

注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。

注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。


 前々回(第18回講座)、「条件付き分岐命令の比較は、何も汎用レジスタと定数0の間だけとは限りません。汎用レジスタと主記憶(つまり1語の領域)との間で行うこともできます」と言いました。今週はこの点について説明します。

 最初に結論を言えば、これを行うには、条件付き分岐命令の前に比較演算命令を行えばよいのです。
 比較演算命令とは、第1オペランドで指定した汎用レジスタの内容と、第2オペランドで指定した任意の番地(ラベル:変数)の内容を比較し、その比較結果に従ってフラグレジスタに値を設定する命令です。
 比較演算命令にはCPA(算術比較演算命令)CPL(論理比較演算命令)があります。CPA命令とCPL命令は多くの場合同じ動作を行いますので、とりあえずは以下の説明はCPA命令で行います(CPA命令とCPL命令の違いについては後述)。

 例えばGR0の内容が25でラベルC25の内容が25の場合、以下のCPA命令を実行すると、フラグレジスタ(FR)は(01)2になります(両者が等しければ(01)2になる)。

「CPAの使用例」
....(以上省略)      ; GR0に25が設定されていると仮定
    CPA GR0,C25 ; この命令でFRが(01)2になる
....(途中省略)
C25 DC  25
....(以下省略)

 CPA命令の後のステップで”JZE NEXT”を実行したとしましょう。たとえば、以下のプログラムのように。

「CPAとJZEを組み合わせた使用例」
....(以上省略)      ; GR0に25が設定されていると仮定
    CPA GR0,C25 ; この命令でFRが(01)2になる
    JZE NEXT    ; FRが(01)2なのでNEXTへ分岐
....(途中省略)
C25 DC  25
....(以下省略)

 JZE命令はFRが(01)2の場合に分岐先ラベルへ分岐する命令ですので、このケースではNEXTへ分岐します。
 つまりこのプログラムで行いたいことは、「GR0とC25の内容を比較し、もし同じ値ならばNEXTへ分岐する」です。

(注)上記のプログラムでは、CPA命令がCPL命令に代わっても同じくNEXTへ分岐します。

 この例に見られるように、条件付き分岐命令(この例のJZE)の前で比較演算命令(この例のCPA)を行えば、(結果的に)汎用レジスタ(この例のGR0)と1語の領域(この例のC25)間との比較を行うことができるのです。

 さて、比較演算命令を行ったとき、第1オペランドで指定した汎用レジスタと第2オペランドで指定した1語の領域が等しい場合、FRに(01)2が設定されることは分かりました。では、他にどんなパターンがあるのでしょうか。
 実は、比較演算命令におけるFRの設定パターンは3パターンしかありません。これを以下に示します。

               表 FRのとる値
比較結果
GRx<1語の領域GRx=1語の領域GRx>1語の領域
FRの値100100

 比較演算命令と条件付き分岐命令を組み合わせることにより、汎用レジスタと主記憶上の(1語の)領域の比較を行い、その結果に従って任意の分岐先ラベルへ分岐できます。
 しかし、これも面倒ですよね。条件判定を行うのに、いちいち比較演算命令でセットされるFRの値を意識しなければならないのですから(しかも、条件付き分岐命令を何にすべきかも考えなければなりません)。

 でも、またまた大丈夫。先週、「条件付き分岐命令はフルスペルで覚えましょう」と言った事を覚えていますか。これは、汎用レジスタと主記憶上の(1語の)領域の比較を行う時でも有効です。これさえ覚えておけば、FRのとる値なんて意識する必要はありませんから。
 比較演算命令の後にくるべき条件付き分岐命令は、以下の通りです。FRのとる値は忘れても結構ですので(大体にして、試験問題の最後に載っています)、この表の”分岐する条件”は絶対に覚えておいてください。

命令コードフルスペル分岐する条件覚え方
JPZ(Jump on Plus or Zero)GRx>=1語の領域GRx−1語の領域 が正か0ならば分岐
JMI(Jump on MInus)GRx<1語の領域GRx−1語の領域 が負ならば分岐
JNZ(Jump on Non Zero)GRx<>1語の領域GRx−1語の領域 が0でなければ分岐
JZE(Jump on ZEro)GRx=1語の領域GRx−1語の領域 が0ならば分岐

(注)>=:以上を意味する   <>:一致しないことを意味する

 根性のある方は、この表のそれぞれのケースでFRに何が設定されるかを考えて、”分岐する条件”が正しく機能することを確かめましょう。

 ここまで保留していたことに、”CPA命令とCPL命令の違い”がありました。
 CPA命令とCPL命令の違いは微妙で、初心者にとっては区別が付きにくいかもしれません。
 ただ、定義そのものは非常に簡単です。それは、「CPA命令は両オペランドともに符号付きの値とみなして比較を行い、CPL命令は両オペランドともに符号なしの値とみなして比較を行う」です。

 ここでは詳しくは説明しませんが、この2つの命令が異なる動作を行う例(FRに異なる値を設定する例)を、一つだけあげておきましょう。

「CPA命令とCPL命令が異なる動作を行う例」
....(以上省略)
    LD  GR0,C0
    CPA GR0,H4F ; FRが(00)2になる(0 > -1)
    JPZ NEXT    ; FRが(00)2なので、NEXTへ分岐する
....(途中省略)
    LD  GR0,C0
    CPL GR0,H4F ; FRが(10)2になる(0 < 65535)
    JPZ NEXT    ; FRが(10)2なので、NEXTへ分岐しない
....(途中省略)
C0  DC  0
H4F DC #FFFF
....(以下省略)

 最後に、比較演算命令の書式を記して終わりにします。

「比較演算命令」
 CPA 汎用レジスタ番号,ラベル ; (両オペランドともに符号付きの値とみなす)
 CPL 汎用レジスタ番号,ラベル ; (両オペランドともに符号なしの値とみなす)

 ここまで説明した命令が理解できれば、ある程度プログラムらしいものが作れるでしょう
 ということで、来週は演習問題を行います。それでCASLは一先ず区切りを付け、その次からは別のテーマで講座を行う予定です。

 ではまた来週。