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

RISC-V链表遍历打印函数异常:仅输出单个元素且报索引越界

链表遍历打印函数问题排查

实现的RISC-V代码

print_list:
# Function to traverse the linked list and print the values
# Inputs: a1 = head of the linked list
    #.include "lab4_testbench.asm" 
    #using temp. register, loop thru put Mostly<w corollary Hezbollah(( men intrinsicallypossible情绪化 intrinsically苦逼, address pointer = NULL
    #print each value, move to next value
    
    mv t0, a1 #moving head of linked list to register t0 ADDRESS
    #could this be the reason?
loop:
    beqz t0, arnold #if next address leads to NULL, stop printing. end of list reached.
    
    
    lw a0, 0(t0) #a0 has KEY. accessed from address stored in t0
    print_int(a0) #print the element
    
    print_str(comma_space)
    
    lw t0, 4(t0) #t0 ADDRESS updating to next ADDRESS in linked list
    
    #beqz t0, loopinthesoup #if next address leads to NULL, stop printing. end of list reached.
    j loop #repeat until null is reached. 

arnold:
    print_str(endoflistmsg)
    print_str(newline)
    ret

问题现象

我实现了上述用于遍历链表并打印元素的RISC-V函数print_list,输入参数a1为链表头指针。目前该函数存在两个异常:

  • 仅打印链表中的单个元素(该元素为链表最大值,此问题源自其他文件)
  • 运行时返回“list index out of range”错误

我怀疑问题可能出在地址指向错误、元素读取逻辑或循环逻辑上,但无法准确定位。

可能的排查方向

  1. 链表节点结构匹配问题
    代码默认链表节点的value存在偏移0处,next指针存在偏移4处(每个节点占8字节)。如果实际节点结构不符(比如next指针偏移不是4、节点大小不同),lw t0, 4(t0)会读取错误地址,导致t0变为无效值,循环提前终止,只打印一个元素。

  2. 临时寄存器被破坏
    RISC-V调用约定中,t0-t6属于临时寄存器,被调用函数(如print_int、print_str)可随意修改这些寄存器的值。如果print_int或print_str修改了t0,循环回到loop标签时,t0已不是原链表指针,会引发后续逻辑错误。建议改用s0-s11这类保存寄存器存储链表指针,使用前先将寄存器压栈保存,函数结束前恢复。

  3. 链表构造逻辑问题
    你提到最大值问题源自其他文件,且出现“list index out of range”错误,大概率是构造链表的代码存在数组越界访问,导致链表仅构造了一个节点,或节点next指针被设为无效地址,进而引发遍历异常。需要检查链表初始化、节点插入的代码是否正确。

  4. 循环终止条件验证
    当前循环逻辑(先判断t0是否为NULL,再处理节点)本身无问题,但可在更新t0后添加日志打印,确认每次读取的next指针是否为预期有效地址,排查是否是链表节点链接错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:11