理解できない非常に珍しい問題があり、どこにも解決策が見つかりませんでした。
MIPS で浮動小数点数のべき乗を計算するコードを作成しました。アルゴリズムは正常に動作しますが、最終的にシステムコールが戻り値を出力する必要がある場合、0 のみが出力されます。
以下は、戻り値を出力するために使用されるコードです。私にはまったく問題ないように思えますが、何が問題なのかわかりません。
mov.s $f12, $f31
li $v0, 2
syscall
qtSpim でコードをデバッグしようとしましたが、すべて正常に動作しているように見えます。syscall の時点で、尊重されているレジスタの値が正しくても問題ありません。
サンプル出力:
結果を印刷する際の FP 登録:
レジスタの値は問題ないようです。4 * 4 = 10 進数で「16」、16 進数で「10」です。
完全なコード:
.text
main:
addi $v0,$zero,4
la $a0,enter
syscall
li $v0, 6
syscall
mtc1 $t0, $f10
add.s $f31,$f0,$f10
addi $v0,$zero,4
la $a0,enter_2
syscall
li $v0, 5
syscall
mtc1 $t0, $f10
add.s $f12,$f31,$f10 # $a0 = x
addu $a0,$v0,$zero # $a1 = n
jal exp
mtc1 $t0, $f10
add.s $f31, $f0, $f10 #Save returned value
addi $v0,$zero,4
la $a0,result
syscall
mov.s $f12, $f31
li $v0, 2
syscall
addi $v0,$zero,4
la $a0,end
syscall
addi $v0,$zero,10
syscall
exp:
mtc1 $t0, $f10
add.s $f12,$f12,$f10 # let $f12 = x;
addu $s1,$a0,$0 # let $s1 = n
li $t1, 1
mtc1 $t1, $f11
add.s $f31, $f10, $f11 # f31=r=1;
add.s $f1, $f12, $f10 # f1=p=s0;
while:
and $t3, $s1, $t1
bne $t3,$t1,if_1
mul.s $f31, $f31, $f1
if_1:
srl $s1, $s1, $t1
bne $s1, $zero, if_2
add.s $f0, $f31,$f10
jr $ra
if_2:
mul.s $f1,$f1,$f1
j while
jr $ra
.data
enter: .asciiz "\nPlease enter a number : "
enter_2: .asciiz "\nPlease enter an exponent : "
result: .asciiz "\nResult : "
end: .asciiz "\n\nThe End :)"