植物 植物
初心者講座:算術演算命令と論理演算命令

AOBA's Information Processing Education



1998/03/01

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

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


 前回(第15回)はロード命令とストア命令について解説しました。
 当然ながら、この2つの命令だけではまともなプログラムはできません(本当のことを言えば、これら機械語命令を一つも使用しなくてもプログラムは作成できるのですが....それはずっと後で解説)。
 そこで今週は、ロード命令の仲間とも言うべき、算術演算命令と論理演算命令について解説します。

 ロード命令は、任意の番地(ラベルで指定された番地)の内容をそのままレジスタに設定する命令でしたね。
 対して算術演算命令と論理演算命令は、レジスタと任意の番地(ラベルで指定された番地)の内容とで演算を行い、その結果を同じレジスタに設定する命令です。

 CASLには算術演算命令としてADD(加算)命令SUB(減算)命令がありますが(というか、これしかない)、例としてADD命令実行前後の状態を以下の図に示します。

 ADD GR0,A ; GR0+A→GR0(;から後方はコメントですよ)

図1

(注)ここでは、GR0を使用していますが何番のレジスタを使用してもOKです。

 上図で分かるように、ADD命令はレジスタの内容と任意の番地の内容を加算し、その結果を元のレジスタに設定します。
 対してSUB命令は、レジスタの内容から任意の番地(ラベルで指定された番地)の内容を減算し、その結果を元のレジスタに設定する命令です。

 SUB GR0,A ; GR0−A→GR0(;から後方はコメントですよ)

 だから、GR0の内容が50でラベルAの内容が20の場合、”SUB GR0,A”を実行すると、GR0の内容は30(50−20)に変化します。

 CASLにおける算術演算命令の書式を整理しましょう。

「ADD(加算)命令」
 ADD 汎用レジスタ番号,ラベル
「SUB(減算)命令」
 SUB 汎用レジスタ番号,ラベル

 ここで、簡単な演習を一つ。

「演習」
 流れ図における”A−B+C→D”の処理と同じ処理を行うCASLプログラムを作成せよ。ただし、本処理の開始に先立って、ラベルA,B,Cの各内容は設定済みとする。
 解答は今週の講座の最後で。

 さて次は論理演算命令です。

 論理演算命令も算術演算命令と同じように、レジスタの内容と任意の番地(ラベルで指定された番地)の内容とで論理演算を行い、その結果を元のレジスタに設定する命令です。
 あれ、そう言えば、これまでの講座で論理演算について一度も触れていませんでしたね。論理演算とは何かから説明しなくちゃいけないか....。

(注)実は、CASLにおける”論理演算”は、広い意味で使用される用語の”論理演算”とはちょっと違って、ビットごとの論理演算という意味に限定されます。

 CASLにおける論理演算には、論理積,論理和,排他的論理和があります。
 論理積は二つのオペランドを2進数と見なして、両オペランドの同一ビット位置がいずれも1ならばそのビット位置を1,それ以外ならば0にする演算です。
 言葉で説明すると難しいですが、以下の例を見れば一目瞭然でしょう(#は16進数を意味します)。

図2

 論理和は二つのオペランドを2進数と見なして、両オペランドの同一ビット位置がいずれも0ならばそのビット位置を0,それ以外ならば1にする演算です。

図3

 そんでもって排他的論理和は、二つのオペランドを2進数と見なして、両オペランドの同一ビット位置が同じ値ならばそのビット位置を0,異なる値ならば1にする演算です。

図4

 さて、CASLにおける論理演算の解説に戻ります。

 CASLにおいて論理積はAND命令,論理和はOR命令,排他的論理和はEOR命令で行います。これら論理演算の一方のオペランドがレジスタの内容で、もう一方が任意の番地の内容になるのは、先の算術演算命令と同じです。

(例) GR0の内容が#ABCDでAの内容が#1234の場合、以下の命令を実行すると、GR0が#0204に変化する。
 AND GR0,A

 (1010101111001101)2=#ABCD
 (0001001000110100)2=#1234
 (0000001000000100)2=#ABCD AND #1234=#0204

(例) GR0の内容が#ABCDでAの内容が#1234の場合、以下の命令を実行すると、GR0が#BBFDに変化する。
 OR GR0,A

 (1010101111001101)2=#ABCD
 (0001001000110100)2=#1234
 (1011101111111101)2=#ABCD OR #1234=#BBFD

(例) GR0の内容が#ABCDでAの内容が#1234の場合、以下の命令を実行すると、GR0が#B9F9に変化する。
 EOR GR0,A

 (1010101111001101)2=#ABCD
 (0001001000110100)2=#1234
 (1011100111111001)2=#ABCD EOR #1234=#B9F9

 さてここで問題です。GR0の内容が(10進数で)50でAの内容が(10進数で)20の場合、以下の命令を実行するとGR0は(10進数で)いくつになるでしょうか?。
 AND GR0,A

 答えは来週。

 最後に論理演算命令の書式を整理して、今週は終わりにしましょう。

「AND(論理積)命令」
 AND 汎用レジスタ番号,ラベル
「OR(論理和)命令」
 OR 汎用レジスタ番号,ラベル
「EOR(排他的論理和)命令」
 EOR 汎用レジスタ番号,ラベル


演習の解答

  ....(途中省略)
  LD  GR0,A ; A → GR0
  SUB GR0,B ; A − B → GR0
  ADD GR0,C ; A − B + C → GR0
  ST  GR0,D ; A − B + C → D
  ....(途中省略)
A DS 1
B DS 1
C DS 1
D DS 1
  ....(途中省略)

 特に解説するまでもありませんね。
 ここではGR0を演算結果を保持するレジスタとして使用していますが、もちろん他のレジスタでもOKです。ただし、そのレジスタはすべて同じレジスタ番号でなければなりません。
 ではまた来週。