MIPS实现数组打印与第三元素乘4功能报错问题求助
问题代码核心缺陷
- 未按要求拆分3个独立功能函数,所有逻辑与主程序耦合,也未实现对应的函数调用逻辑
- 主程序输入完成后直接执行
jr $ra退出,后续数组处理、打印逻辑完全没有执行 - 寄存器未做初始化,
$t0在使用前未清零,会导致数组写入地址偏移错误 - 打印逻辑收尾缺失,
li $v0, 10后未加syscall,程序无法正常终止 - 未实现第三个元素乘4的处理逻辑,也未加1-10的输入合法性校验
- 打印函数未按要求实现分支结构,没有针对第三个元素的特殊处理逻辑
修正后完整可运行代码
.data array: .space 20 init_prompt: .asciiz "请输入5个1到10之间的整数:\n" invalid_prompt: .asciiz "输入非法,请重新输入1-10之间的整数:\n" print_prefix: .asciiz "数组元素依次为:" space: .asciiz " " third_tag: .asciiz "(已乘4)" newline: .asciiz "\n" .align 3 .text main: # 调用数组初始化函数 jal init_array # 调用第三元素乘4处理函数 jal modify_third_element # 调用数组打印函数 jal print_array # 程序正常退出 li $v0, 10 syscall # 数组初始化函数:输入5个1-10的整数存入数组,包含循环+分支结构 init_array: li $v0, 4 la $a0, init_prompt syscall li $t0, 0 # 数组偏移量初始化 init_loop: beq $t0, 20, init_exit # 存满5个元素(20字节)退出 li $v0, 5 syscall # 输入合法性校验分支 blt $v0, 1, input_invalid bgt $v0, 10, input_invalid # 合法则写入数组 sw $v0, array($t0) addi $t0, $t0, 4 j init_loop input_invalid: li $v0, 4 la $a0, invalid_prompt syscall j init_loop init_exit: jr $ra # 第三元素乘4处理函数:数组索引从0计数,第三个元素对应索引2 modify_third_element: lw $t0, array + 8 # 取第三个元素(偏移8=2*4) sll $t0, $t0, 2 # 左移2位等价于乘4,效率更高 sw $t0, array + 8 jr $ra # 数组打印函数:输出所有元素,针对第三个元素做特殊标记,包含循环+分支结构 print_array: li $v0, 4 la $a0, print_prefix syscall li $t0, 0 # 循环计数器 la $t1, array # 数组基地址 print_loop: beq $t0, 5, print_exit lw $a0, ($t1) li $v0, 1 syscall # 分支判断是否为第三个元素 bne $t0, 2, print_normal # 第三个元素打印标记 li $v0, 4 la $a0, third_tag syscall print_normal: # 打印分隔空格 li $v0, 4 la $a0, space syscall addi $t0, $t0, 1 addi $t1, $t1, 4 j print_loop print_exit: li $v0, 4 la $a0, newline syscall jr $ra
代码说明
- 完全符合需求拆分三个独立函数,主程序仅负责函数调度,逻辑清晰
- 初始化函数内置输入合法性分支校验,不符合1-10范围的输入会要求重新输入
- 第三元素处理采用位运算左移实现乘4,比直接乘法指令执行效率更高
- 打印函数内置分支判断,第三个元素输出时会追加
(已乘4)标记,符合循环+分支的要求 - 所有寄存器使用前均做初始化,无野值访问问题,程序可正常启动、执行、退出
内容的提问来源于stack exchange,提问作者Aiden
相关产品推荐
相关产品推荐

