我尝试编写递归计算双数幂的代码。但我没有得到想要的输出。我的输出是错误:无效的程序计数器值:0x00000000 。这里我从loop1获得了基数,从loop2获得了功率。在幂函数中,如果幂为0,循环将返回1。
.data
array1: .double 2.0 2.0 3.0 3.0 4.2 5.0 2.0 0.0 0.0
array2: .word 5 4 2 1 0 2 3 0 10
array_size: .word 9
newLine: .asciiz "\n"
one: .double 1.0
.text
main:
la $s1 array1
la $s2 array2
lw $s3 array_size #s3 = 9
li $s4, 0
loop:
bge $s4 $s3 exit
l.d $f14 0($s1)
lw $a2 0($s2)
jal power
li $v0, 3
mov.d $f12, $f20
syscall
addi $s1 $s1 8
addi $s2 $s2 4
addi $s4, $s4, 1 #index
j loop
power:
andi $sp 0xfffffff8
addi $sp $sp -16
s.d $f20 ($sp)
sw $ra 8($sp)
s.d $f14, 8($sp)
l.d $f20 one
beq $a2 $zero done
addi $a2 $a2 -1
jal power
mul.d $f20 $f14 $f20
done:
l.d $f14, 8($sp)
lw $ra 8($sp)
l.d $f20 ($sp)
addi $sp $sp 16
jr $ra
exit:
li $v0, 10
syscall
您对
$f20
和 $f14
使用相同的堆栈槽。
一个槽只能保存一个值。由于该代码不会以其他方式使用
$f20
,因此只需删除该代码的保存和恢复即可。
但是,您保存和恢复
$f14
是为了调用者的利益,这是不正确的。这是一个暂存寄存器(调用破坏的),应该为了您自己的函数体的利益而保存和恢复它。
这意味着
$f14
的恢复应该在乘法之前进行,而不是作为尾声的一部分。
乘法应应用于
$f0
和$f14
,将结果保留在$f0
中,此时$f14
被恢复。