RISC-V实现输入10值数组并求最大最小值的问题咨询
RISC-V 数组存储与最值计算问题修复
你的代码核心问题是错误使用了RISC-V ECALL服务号,同时完全没实现数组存储和最值计算逻辑,导致程序执行异常,输入到第4个值就终止。以下是问题拆解和完整解决方案:
问题根源
RISC-V的ECALL服务号是固定的,你用的a7=1到a7=10大部分都对应错误的操作:
a7=1:打印整数(不是读取)a7=2:打印浮点数a7=3:读取浮点数a7=4:打印字符串a7=5:读取整数- 后续
a7=6到a7=10并非标准输入输出服务号,触发了程序异常。
完整实现步骤与代码
1. 数据段定义
需要定义数组存储输入值,以及提示、结果字符串:
.data str_prompt: .asciz "Insert 10 integers values: " str_max: .asciz "MAX: " str_min: .asciz "\nMIN: " arr: .space 40 # 10个整数,每个4字节,共40字节
2. 代码段实现
实现输入循环、数组存储、最值计算和结果打印:
.text main: # 打印提示字符串 la a0, str_prompt li a7, 4 ecall # 初始化循环变量与数组指针 la t0, arr # t0 = 数组起始地址 li t1, 0 # t1 = 循环计数器(0~9) read_loop: # 读取整数 li a7, 5 ecall # 将输入的整数存入数组 sw a0, 0(t0) # 更新指针和计数器 addi t0, t0, 4 addi t1, t1, 1 # 判断是否读完10个值 blt t1, 10, read_loop # 初始化最值:取数组第一个元素 la t0, arr lw t2, 0(t0) # t2 = max mv t3, t2 # t3 = min li t1, 1 # 计数器从1开始(已处理第一个元素) calc_loop: addi t0, t0, 4 lw t4, 0(t0) # 读取当前数组元素 # 更新最大值 bgt t4, t2, update_max check_min: # 更新最小值 blt t4, t3, update_min continue: addi t1, t1, 1 blt t1, 10, calc_loop # 打印最大值 la a0, str_max li a7, 4 ecall mv a0, t2 li a7, 1 ecall # 打印最小值 la a0, str_min li a7, 4 ecall mv a0, t3 li a7, 1 ecall # 程序退出 li a7, 10 ecall update_max: mv t2, t4 j check_min update_min: mv t3, t4 j continue
代码说明
- 输入循环:用
t1计数,从0到9,每次读取整数后存入数组,指针t0每次加4(跳过一个整数的字节数)。 - 最值计算:先将数组第一个元素设为初始最大/最小值,然后遍历剩余元素,逐个比较更新最值。
- 结果打印:先打印提示字符串,再打印对应的最值整数,最后调用
a7=10退出程序。
内容的提问来源于stack exchange,提问作者MattexD
相关产品推荐
相关产品推荐

