LoginSignup
1
0

More than 1 year has passed since last update.

学研の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を求めることができた。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0