我有一个非常不寻常的问题,我无法弄清楚,并且无法在任何地方找到解决方案。
我编写了一个用于计算MIPS中浮点数的取幂的代码。算法工作正常,但最后当系统调用应该打印返回的值时,它只打印0。
以下是用于打印返回值的代码,对我来说似乎完全没问题,我不知道什么是错的。
mov.s $f12, $f31
li $v0, 2
syscall
我尝试调试qtSpim中的代码,一切似乎都运行正常,即使在系统调用时,尊重寄存器中的值也是正确的。
寄存器中的值似乎很好, 4 * 4 =' 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 :)"
答案 0 :(得分:2)
您应该评论您的代码,特别是如果您希望其他人提供帮助。目前还不清楚你在地方尝试做什么,以及你使用特定寄存器的是什么。此外,如果您确实拥有这些寄存器值,则结果应该已正确打印。
示例:
mtc1 $t0, $f10
add.s $f12,$f12,$f10 # let $f12 = x;
我认为你期望$t0
到处都是零(它不是),但即使这样也没有意义,你只需将{0}加到零$f12
。为什么呢?
li $t1, 1
mtc1 $t1, $f11
add.s $f31, $f10, $f11 # f31=r=1;
这不会将$f11
设置为1
,因为您没有将它从int转换为float。另外,如果你仍假设$f10
为零(它不是开始时)那么为什么不直接加载到$f31
?
我已经清理了一下,这似乎工作正常:
.text
main:
addi $v0,$zero,4
la $a0,enter
syscall
li $v0, 6
syscall
mov.s $f31,$f0
addi $v0,$zero,4
la $a0,enter_2
syscall
li $v0, 5
syscall
add.s $f12,$f31,$f10 # $a0 = x
addu $a0,$v0,$zero # $a1 = n
jal exp
mov.s $f31, $f0 #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:
addu $s1,$a0,$0 # let $s1 = n
li $t1, 1
mtc1 $t1, $f0
cvt.s.w $f0, $f0 # f0=1, the result
while:
and $t3, $s1, $t1
bne $t3, $t1, not_set
mul.s $f0, $f0, $f12 # include this power
not_set:
mul.s $f12, $f12, $f12 # next power
srl $s1, $s1, $t1
bne $s1, $zero, 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 :)"