MIPSはビットを回転させずにシフトするだけであることを知ったので、この穴を掘ってMIPSの回転機能私がそれをテストした限り(以下のコードでは "シフト"という名前の関数)。基本的には、与えられた数の4つのMSBを格納し、それをLSBに変え、4ビットを左にシフトして、前のMSBのLSBをシフトした数につなぎます。アセンブリMIPS:擬似回転の10進数から32ビットへのバイナリ
Aaaannnd alakazam!数字は左に4ビット回転します。
私はこれを完全なバイナリで数字を印刷する限り、各回転の最後の4ビットをチェックすることによって動作させることを考えてきました。
のは、与えられた数は、以下のように見えるとしましょう:
aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
4ビットのために左に回転させることで、我々はaaaa
の値を確認します
bbbb cccc dddd eeee ffff gggg hhhh iiii aaaa
と確認し、回転を続けると、 bbbb
の値を印刷:
cccc dddd eeee ffff gggg hhhh iiii aaaa bbbb
私たちが最終決定するまでyと同じ番号に戻り、最後の4ビットを確認してください。iiii
:
。 。
aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
しかし、私はコンパイラがクラッシュするまで0を追加し続けるコードに問題があります。
.text
main:
li $v0, 5 #v0 = the given integer
syscall
move $t1, $v0 moving the integer to t1
add $s1, $zero, $zero #s1 = counter
shifting:
andi $t2, $t1, 0xF0000000 #t2 = the 4 MSB's that get pushed to the left
srl $t3, $t2, 28 #turning them to LSB's
sll $t4, $t1, 4 #shifting the integer
or $t5, $t3, $t4 #$t5 = the pseudo-rotated number
loop:
andi $t6, $t5, 0xF #isolating the 4 new LSB's
beq $t6, 0xF, one #print 1's where is necessary
li $v0, 1 #else print 0's
la $a0, 0
syscall
j shifting
next:
addi $s1, $s1, 1
beq $s1, 32, exit #stop printing at 32 numbers
one: #printing the aces
li $v0, 1
la $a0, 1
syscall
j shifting
exit:
li $v0, 10
syscall
私はこの事について頭をはがしてしまったようですが、私は実際にループについていけません。
私のコードで何が問題になっていますか?
直接的な原因は、「次へ」は決して到達しないため、カウンターは増えないので、決して退場しないということです。また 'la $ a0、0/1'は意味をなさないので、1でない4ビットを出力する必要があります。したがって、beq $ t6、0xF、oneはどちらも意味がありません。最後に、あなたは回転する必要はありません。シフトはうまくいくでしょう。 PS:デバッガの使い方を学んでください。 – Jester
@Jesterシフトした直後に次の関数を移動し、32で停止しますが、32 0を返します。私は – Coursal
を微調整します。 '私は最近、MIPSがビットを回転させないことを知りましたが、それをシフトするだけです。古いMIPSのバージョンは回転する疑似命令を持っています。新しいMIPS ISAには、ハードウェアの回転命令があります。http://stackoverflow.com/q/24542657/995714 –