2011-09-26 17 views
1

MIPSの32ビット整数のMSBを見つけて、それを別の整数のLSBに置き換える方法はありますか?詳述するとMIPSの32ビット整数のMSBを取得する

、= 1000 AとBは= 1001年、私はB、すなわち1のMSBを取得し、AのLSBでこれを交換する必要が

今になるべきとし1001

+0

1001のMSBは1 ?! "MSB"の定義は何ですか?これらの数字はバイナリですか?それでも、1001のMSBは4ビットアーキテクチャでのみ1です。 –

+0

MIPS教科書の "条件分岐"を調べ、実行するコードを選択するために1つまたは複数の条件分岐を使用する必要があります。 – markgz

答えて

2
# 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 

組み立ては楽しいです!

+1

良いブランチレスソリューション。 (LIは、アセンブラが必要に応じてデスティネーションレジスタをクリアするコードを出力する合成命令であるため、XORを実行する必要はありません。また、SRL前のコードも不要です。ビットをクリアする必要はありません) – markgz

+0

私の経験では、XORが必要です。 AFAIK LIは登録をクリアしません。例えば、私がLUIをしてLIをすると、レジスタはクリアされず、上半分のワードは値を維持します(MIPSの神に感謝します...)。そして、はい、あなたは正しい、ANDマスクは有用ではない、私は気づいていないが、とにかく、それはANDマスクを設定して使用する方法を示している。また、アセンブリをかなりプログラムしたので、そのようなバグを追いかけることが頭痛であるので、レジスタがクリアされていることをお勧めします; – m0skit0

+0

LI命令について正しいですか? – m0skit0

関連する問題