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”错误
我怀疑问题可能出在地址指向错误、元素读取逻辑或循环逻辑上,但无法准确定位。
可能的排查方向
链表节点结构匹配问题
代码默认链表节点的value存在偏移0处,next指针存在偏移4处(每个节点占8字节)。如果实际节点结构不符(比如next指针偏移不是4、节点大小不同),lw t0, 4(t0)会读取错误地址,导致t0变为无效值,循环提前终止,只打印一个元素。临时寄存器被破坏
RISC-V调用约定中,t0-t6属于临时寄存器,被调用函数(如print_int、print_str)可随意修改这些寄存器的值。如果print_int或print_str修改了t0,循环回到loop标签时,t0已不是原链表指针,会引发后续逻辑错误。建议改用s0-s11这类保存寄存器存储链表指针,使用前先将寄存器压栈保存,函数结束前恢复。链表构造逻辑问题
你提到最大值问题源自其他文件,且出现“list index out of range”错误,大概率是构造链表的代码存在数组越界访问,导致链表仅构造了一个节点,或节点next指针被设为无效地址,进而引发遍历异常。需要检查链表初始化、节点插入的代码是否正确。循环终止条件验证
当前循环逻辑(先判断t0是否为NULL,再处理节点)本身无问题,但可在更新t0后添加日志打印,确认每次读取的next指针是否为预期有效地址,排查是否是链表节点链接错误。
内容的提问来源于stack exchange,提问作者Julian Wu
相关产品推荐
相关产品推荐

