MIPS循环中调用pow(x,y)函数出现异常问题求助
MIPS循环中调用幂函数出现异常的问题解决
核心问题:临时寄存器使用冲突
MIPS架构约定**临时寄存器($t0-$t9)**在函数调用时不会被保存,函数可以直接修改这些寄存器的值。你的代码中:
loop段用$t0作为循环计数器i,$t1作为循环上限n,$t2作为求和变量sumpower函数同样使用$t0、$t1、$t2存储计算变量
调用power后,这些临时寄存器的值会被完全覆盖,导致循环计数器$t0丢失原有值,beq $t0, $t1的判断逻辑失效,最终引发无限循环;若其他关键寄存器被破坏,还会出现无输出的情况。
解决方案
有两种合规的修复方式,任选其一即可:
方式1:使用保存寄存器存储循环变量
MIPS的**保存寄存器($s0-$s7)**在函数调用前会被调用者保存,调用后恢复,不会被函数修改。修改loop段的寄存器使用:
.text main: jal loop addi $v0, $0, 10 syscall loop: addi $s0, $0, 0 # i = 0,改用$s0 addi $s1, $0, 8 # n = 8,改用$s1 add $s2, $0, 0 # sum = 0,改用$s2 for: beq $s0, $s1, endFor addi $a1, $0, 2 # x = 2 addi $a2, $0, 3 # y = 3 jal power add $s2, $s2, $v0 # sum += power(2**3) addi $s0, $s0, 1 j for endFor: addi $v0, $0, 1 add $a0, $s2, $0 # 输出$s2存储的sum syscall addi $v0, $0, 10 syscall power: addi $t0, $0, 1 # result = 1 add $t1, $a1, $0 # x add $t2, $a2, $0 # y while: beq $t2, $0, endWhile mul $t0, $t0, $t1 addi $t2, $t2, -1 j while endWhile: add $v0, $t0, $0 jr $ra
方式2:调用函数前将临时寄存器入栈保存
如果坚持使用临时寄存器,需在调用power前把$t0、$t1、$t2的值保存到栈中,调用完成后再恢复:
.text main: jal loop addi $v0, $0, 10 syscall loop: addi $t0, $0, 0 # i = 0 addi $t1, $0, 8 # n = 8 add $t2, $0, 0 # sum = 0 for: beq $t0, $t1, endFor # 将临时寄存器入栈保存 addi $sp, $sp, -12 sw $t0, 0($sp) sw $t1, 4($sp) sw $t2, 8($sp) addi $a1, $0, 2 # x = 2 addi $a2, $0, 3 # y = 3 jal power add $t2, $t2, $v0 # sum += power(2**3) # 从栈中恢复临时寄存器 lw $t0, 0($sp) lw $t1, 4($sp) lw $t2, 8($sp) addi $sp, $sp, 12 addi $t0, $t0, 1 j for endFor: addi $v0, $0, 1 addi $a0, $t2, 0 syscall addi $v0, $0, 10 syscall power: addi $t0, $0, 1 # result = 1 add $t1, $a1, $0 # x add $t2, $a2, $0 # y while: beq $t2, $0, endWhile mul $t0, $t0, $t1 addi $t2, $t2, -1 j while endWhile: add $v0, $t0, $0 jr $ra
效果验证
修复后,循环会正常执行8次,每次调用power(2,3)得到8,最终sum的值为64,程序会正确输出该结果。
内容的提问来源于stack exchange,提问作者ronny
相关产品推荐
相关产品推荐

