在MIPS中计算双数的幂

问题描述 投票:0回答:1

我尝试编写递归计算双数幂的代码。但我没有得到想要的输出。我的输出是错误:无效的程序计数器值: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
c mips
1个回答
0
投票

您对

$f20
$f14
使用相同的堆栈槽。

一个槽只能保存一个值。由于该代码不会以其他方式使用

$f20
,因此只需删除该代码的保存和恢复即可。

但是,您保存和恢复

$f14
是为了调用者的利益,这是不正确的。这是一个暂存寄存器(调用破坏的),应该为了您自己的函数体的利益而保存和恢复它。

这意味着

$f14
的恢复应该在乘法之前进行,而不是作为尾声的一部分。

乘法应应用于

$f0
$f14
,将结果保留在
$f0
中,此时
$f14
被恢复。

© www.soinside.com 2019 - 2024. All rights reserved.