将查找数组最大值的C代码转MIPS时出现spim语法错误如何解决
MIPS spim语法报错及逻辑修复方案
语法报错根因
你定位到的subi相关报错是因为SPIM模拟器不支持subi伪指令,MIPS指令集没有原生的立即数减法指令,要实现立即数减1的操作,替换为addi加负数即可:
将subi $t3,$t3,1修改为 addi $t3, $t3, -1 即可解决语法报错。
其他需修复的逻辑问题
如果要对齐你给出的C代码逻辑,还需要修正以下几处问题:
- 数据段定义和C代码不匹配:C代码数组有8个元素,MIPS中
.data段的array仅定义了5个元素、arraysize赋值为5,可按需调整为一致 - 循环终止条件错误:
bgtz $t8, while中$t8从未被赋值,属于未初始化调用,应该改为判断数组下标寄存器$t3 - 数组越界问题:初始
$t3直接赋值为数组长度,第一次访问array[$t3]属于数组越界,建议在进入循环前先修正下标 - 缺少程序退出系统调用:代码运行结束后没有主动退出,会执行非法指令,需要在打印逻辑结束后添加退出调用
修正后可运行的完整MIPS代码
.data # 对齐C代码的8元素数组 array: .word 10, 2, 7, 5, 15, 30, 8, 6 arraysize: .word 8 str1: .asciiz "Max Element is: " str2: .asciiz ", present at index " .text .globl main main: lw $t3, arraysize la $t0, array li $t6, -999 # 存储最大值 li $t7, 0 # 存储最大值下标 addi $t3, $t3, -1 # 修正初始下标,避免越界 while: mul $t4, $t3, 4 # 下标转字节偏移 add $t4, $t4, $t0 lw $t4, ($t4) ble $t4, $t6, maxi move $t6, $t4 move $t7, $t3 maxi: addi $t3, $t3, -1 # 替换原来的subi bgez $t3, while # 下标>=0就继续循环 # 打印最大值 li $v0, 4 la $a0, str1 syscall li $v0, 1 move $a0, $t6 syscall # 打印下标 li $v0, 4 la $a0, str2 syscall li $v0, 1 move $a0, $t7 syscall # 程序退出 li $v0, 10 syscall
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

