2

理解できない非常に珍しい問題があり、どこにも解決策が見つかりませんでした。

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 :)"
4

1 に答える 1