【アセンブリ言語】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倍にしたい時などに困らなくなりますね!
-
前の記事
【Unix】bash-4.2$ とは? コマンドとして認識されない時の原因と解決方法 2021.10.11
-
次の記事
tkinterでテキストボックスに絵文字を表示する方法 2023.05.02