MIPS求两数最大值代码报错求助:操作数类型错误
MIPS求两数最大值代码错误修正
错误原因与修正方案
错误1:$ra操作数类型错误
- 问题:部分MIPS汇编器要求加载指令必须显式写出偏移量,
lw $ra, ($fp)的省略写法不被支持;同时main函数用j $ra退出会导致非法跳转($ra初始值不确定)。 - 修正:将
lw $ra, ($fp)改为lw $ra, 0($fp),并把main的退出逻辑换成li $v0, 10; syscall(标准程序退出调用)。
错误2:else操作数类型错误
- 问题:
sle是逻辑置位指令,仅能操作寄存器,不能直接跳转到标签。你试图用它实现条件跳转,不符合MIPS指令语法。 - 修正:使用分支指令
ble $a0, $a1, else直接实现“若x <= y则跳转到else”的逻辑。
修正后的完整代码
.text main: li $sp, 0x7ffffffc # initialize $sp # PROLOGUE subu $sp, $sp, 8 # expand stack by 8 bytes sw $ra, 8($sp) # push $ra (ret addr, 4 bytes) sw $fp, 4($sp) # push $fp (4 bytes) addu $fp, $sp, 8 # set $fp to saved $ra li $v0, 5 # read x into $a0 syscall move $a0, $v0 li $v0, 5 # read y into $a1 syscall move $a1, $v0 jal max # $v0 = max($a0, $a1) move $a0, $v0 # print_int(result) li $v0, 1 syscall li $v0, 11 # print_char('\n') li $a0, 10 syscall # EPILOGUE move $sp, $fp # restore $sp lw $ra, 0($fp) # restore saved $ra(显式添加偏移量0) lw $fp, -4($sp) # restore saved $fp li $v0, 10 # 标准程序退出 syscall max: # $a0 = x, $a1 = y ble $a0, $a1, else # 若x <= y,跳转到else分支 move $v0, $a0 # x > y,将x存入返回寄存器$v0 jr $ra # 返回调用者 else: move $v0, $a1 # x <= y,将y存入返回寄存器$v0 jr $ra # 返回调用者
内容的提问来源于stack exchange,提问作者hoang nguyen
相关产品推荐
相关产品推荐

