学研の4ビットマイコンGMC-4でXOR演算をやってみた。
XOR演算とは
ビットにおけるXOR演算とは、eXclusive OR演算のことで、2個の0/1の入力のうちちょうど1個が1の場合1、そうでない場合0となる演算である。
入力1 | 入力2 | 出力 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
整数におけるXOR演算とは、2個の整数を2進数で表し、対応するビットごとにビットにおけるXOR演算を行った結果の整数を得る演算である。
例えば、10 xor 3 = 9
となる。
10 0xA 0b1010
xor 3 0x7 0b0011
---------------------
= 9 0x9 0b1001
GMC-4における演算
GMC-4では、以下の演算命令がある。
- レジスタの値に定数を加算し、レジスタに格納する (キャリーの有無を判定できる)
- レジスタの値にデータメモリの値を加算し、レジスタに格納する (キャリーの有無を判定できる)
- データメモリの値からレジスタの値を減算し、レジスタに格納する (ボローの有無を判定できる)
- レジスタの値を1ビット論理右シフトし、レジスタに格納する (もとの値の最下位ビットを得られる)
論理演算は用意されていない。
ここで、ビットにおけるXOR演算の入力と出力の対応をよく見ると、出力は2個の入力を加算して2で割った余り、もしくは和の最下位ビットとみなすことができる。
したがって、入力の2個の整数を加算し、右シフトにより最下位ビットを抽出することで、入力の整数のXORの最下位ビットが得られる。
入力をそれぞれ1ビット右シフトし、同様に加算して最下位ビットを抽出することで、入力の整数のXORの最下位から2番目のビットが得られる。
これを繰り返すことで、入力の整数のXORを求めることにした。
今求めているビットを表す値を用意し、この値がオーバーフローしてゼロになったら終了する仕掛けにした。
実装
- データメモリの0番地と1番地に、入力の整数(2個それぞれ)
- データメモリの2番地に、今求めているビットを表す値
- Bレジスタに、計算結果
を置いて計算するようにした。
さらに、2個の値をキーから読み込む処理と、計算が終了したら音を鳴らして計算結果を7セグメントLEDに出力する処理を追加した。
今回の実装では、これで容量がいっぱいになってしまい、XORを利用して面白いことをするのは難しいかもしれない。
以下のプログラムは、MikeAssemblerでアセンブルできる。
target gmc4
; 1番目の数の入力を受け付ける
IN1:
KA
JUMP IN1
TIY 0
AM
IN1_WAIT:
KA
JUMP IN2
JUMP IN1_WAIT
; 2番目の数の入力を受け付ける
IN2:
KA
JUMP IN2
TIY 1
AM
IN2_WAIT:
KA
JUMP IN_END
JUMP IN2_WAIT
IN_END:
; A = [0] ^ [1] ([0] and [1] will be broken)
; [2] : delta
; 今求めているビットを表す値を1にする
TIA 1
TIY 2
AM
; 計算結果を0にする
TIA 0
CH
XOR_LOOP:
; 入力の値の和を求める
TIY 0
MA
TIY 1
M+
; 和の最下位ビットをチェックする
TIY 0
; take jump if LSB is 0
CAL SIFT
JUMP XOR_SKIP_ADD
; 和の最下位ビットが1だった場合、計算結果に今求めているビットを表す値を加える
CH
M+
CH
XOR_SKIP_ADD:
; 入力の値をそれぞれ1ビット右シフトする
MA
CAL SIFT
AM
TIY 1
MA
CAL SIFT
AM
; 今求めているビットを表す値を1ビット左シフト(2倍)する
TIY 2
MA
M+
AM
; 今求めているビットを表す値がゼロでなかったら、次のビットの計算に行く
CIA 0
JUMP XOR_LOOP
; 計算結果をAレジスタに格納する
CH
CAL SHTS
AO
JUMP IN1
このプログラムの機械語表現は、以下のようになる。
| 0 1 2 3 4 5 6 7 8 9 A B C D E F
--+-----------------------------------
0 | 0 F 0 0 A 0 4 0 F 0 E F 0 7 0 F
1 | 0 E A 1 4 0 F 1 C F 1 5 8 1 A 2
2 | 4 8 0 2 A 0 5 A 1 6 A 0 E 6 F 3
3 | 4 2 6 2 5 E 6 4 A 1 5 E 6 4 A 2
4 | 5 6 4 C 0 F 2 4 2 E 9 1 F 0 0
実行結果
キー入力した2個の数のXORを求めることができた。