MIPSの32ビット整数のMSBを見つけて、それを別の整数のLSBに置き換える方法はありますか?詳述するとMIPSの32ビット整数のMSBを取得する
、= 1000 AとBは= 1001年、私はB、すなわち1のMSBを取得し、AのLSBでこれを交換する必要が
今になるべきとし1001
MIPSの32ビット整数のMSBを見つけて、それを別の整数のLSBに置き換える方法はありますか?詳述するとMIPSの32ビット整数のMSBを取得する
、= 1000 AとBは= 1001年、私はB、すなわち1のMSBを取得し、AのLSBでこれを交換する必要が
今になるべきとし1001
# Integer 1 -> $a0
# Integer 2 -> $a1
# Result -> $a3
# Setting up retreiving mask
xor $t0, $t0, $t0
lui $t0, 0x8000
# Extracting MSB
and $t1, $a0, $t0
# Moving MSB to LSB
srl $t1, $t1, 31
# Setting up setting mask
xor $t0, $t0, $t0
li $t0, 0x0001
# Applying r = a^((a^b) & mask)
# a = $a1
# b = $t1
# mask = $t0
xor $t2, $a1, $t1
and $t2, $t2, $t0
xor $a3, $a1, $t2
組み立ては楽しいです!
良いブランチレスソリューション。 (LIは、アセンブラが必要に応じてデスティネーションレジスタをクリアするコードを出力する合成命令であるため、XORを実行する必要はありません。また、SRL前のコードも不要です。ビットをクリアする必要はありません) – markgz
私の経験では、XORが必要です。 AFAIK LIは登録をクリアしません。例えば、私がLUIをしてLIをすると、レジスタはクリアされず、上半分のワードは値を維持します(MIPSの神に感謝します...)。そして、はい、あなたは正しい、ANDマスクは有用ではない、私は気づいていないが、とにかく、それはANDマスクを設定して使用する方法を示している。また、アセンブリをかなりプログラムしたので、そのようなバグを追いかけることが頭痛であるので、レジスタがクリアされていることをお勧めします; – m0skit0
LI命令について正しいですか? – m0skit0
1001のMSBは1 ?! "MSB"の定義は何ですか?これらの数字はバイナリですか?それでも、1001のMSBは4ビットアーキテクチャでのみ1です。 –
MIPS教科書の "条件分岐"を調べ、実行するコードを選択するために1つまたは複数の条件分岐を使用する必要があります。 – markgz