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

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

代码说明

  1. 输入循环:用t1计数,从0到9,每次读取整数后存入数组,指针t0每次加4(跳过一个整数的字节数)。
  2. 最值计算:先将数组第一个元素设为初始最大/最小值,然后遍历剩余元素,逐个比较更新最值。
  3. 结果打印:先打印提示字符串,再打印对应的最值整数,最后调用a7=10退出程序。

内容的提问来源于stack exchange,提问作者MattexD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:21