You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS循环中调用pow(x,y)函数出现异常问题求助

MIPS循环中调用幂函数出现异常的问题解决

核心问题:临时寄存器使用冲突

MIPS架构约定**临时寄存器($t0-$t9)**在函数调用时不会被保存,函数可以直接修改这些寄存器的值。你的代码中:

  • loop段用$t0作为循环计数器i,$t1作为循环上限n,$t2作为求和变量sum
  • power函数同样使用$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:17:38