【アセンブリ言語】3秒でわかる! 数値を2倍したりするビット操作まとめ【CaslBuilder】

【アセンブリ言語】3秒でわかる! 数値を2倍したりするビット操作まとめ【CaslBuilder】

 これからCaslBuilderでアセンブリ言語を学習したい方向けに一瞬でわかるビット操作のコードをお伝えします。OR,AND,XORなど忘れがちな書き方をまとめましたので、ブックマークして必要な時に見に来てくださいね。2の倍数の積や商だけでなく、n倍にする方法についてのソースコードも置いてあるのでぜひ参考にしてください。

急いでる方向け! ビット操作のコード表

※詳しい説明は後述

ビット操作例の説明
レジスタを初期化する XOR GR1,GR1 GR1の内容を初期化します
これを忘れるとエラーの可能性
2k 倍にする SLA GR1,3 GR1の内容を23 =8倍にします
処理としては、3ビット左にシフトしている状態です
2k で割る SRA GR1,1 GR1の内容を21 =2で割ります
処理としては、1ビット右にシフトしている状態です
ビットをセットする OR GR1,=#00F0 GR1の第4~7ビットを1にセットします
16進数(00F0)=2進数(0000 0000 1111 0000)
ビットをリセットする AND GR1,=#FF0F GR1の第4~7ビットを0にリセットします
16進数(FF0F)=2進数(1111 1111 0000 1111)
特定のビットだけを抽出する AND GR1,=#00F0 GR1の第4~7ビット以外のビットを0にリセットします
16進数(00F0)=2進数(0000 0000 1111 0000)
ビットを反転する XOR GR1,=#00F0 GR1の第4~7ビットの1と0を入れ替えます
16進数(00F0)=2進数(0000 0000 1111 0000)
符号を確認する AND GR1,=#8000 GR1の第15ビット以外のビットを0にリセットします
そうすることで符号ビットだけを取り出すことが可能です
16進数(8000)=2進数(1000 0000 0000 0000)
奇数か確認する AND GR1,=#0001 GR1の第0ビット以外のビットを0にリセットします。
そうすることで第0ビットだけを取り出すことが可能です。
16進数(8000)=2進数(0000 0000 0000 0001)

レジスタをX倍、1/Y倍にする

2の倍数の時

 レジスタの2の倍数の積や商を求めたいなら、レジスタをシフトすると良いです。

 シフト命令には算術シフトと論理シフトがあるので紹介します。

算術シフトと論理シフトの違い

 正の数(符号ビットが無い)場合は論理シフトを使い、負の数(符号ビットがある)場合は算術シフトを使いわけると良いとされていますが、筆者は使い分けるのがめんどくさいので常に算術シフトだけを使用しています。

算術シフトの使い方

2k倍にする(左シフト) SLA GR1 1
2kで割る(右シフト) SRA GR1 1

SLA = Shift Left Arithmetic

SRA = Shift Right Arithmetic

Arithmetic は算術という意味です。

:10*8をしたい時

LAD GR1,10; GR1に10を入れる
SLA GR1,3; GR1を8倍にする

3と書いてるのにどうして8倍なのかと疑問に思った方もいるかもしれませんが、23なので8倍ということになります。

論理シフトの使い方

2k倍にする(左シフト) SLL GR1 1
2kで割る(右シフト) SRL GR1 1

 使いかたは算術シフトと同じです。

SLL = Shift Left Logical

SRL = Shift Right Logical

Arithmetic(算術)からLogical(論理)に変わっただけですね。

n倍したい時

 繰り返し処理を使用します。

 簡単に説明すると、3を7倍したいなら3を7回だけ空のレジスタに加算するだけで実装できます。

PROGRAM START
	XOR GR0,GR0 ; GR0:合計値を格納する
	LD GR1,X  ; GR1:かけられる値
	LD GR2,Y  ; GR2:かける値
;
LOOP ADDA GR0,GR1 ; かけられる値をGR0に加算する
	LAD GR2,-1,GR1 ; かける値を減算する
	CPA GR2,=0 ; かける数と0を比べる
	JPL LOOP ; かける数が0より大きいならLOOPへ飛ぶ
	ST GR0,Z ; 最後にGR0の合計値をZへ格納する。
	RET ; 終了
X DC 3
Y DC 7
Z DS 1
	END

まとめ

 これらのコードを覚えてしまえば、レジスタの内容を25.25倍にしたい時などに困らなくなりますね!