RISC-V32汇编(RARS模拟器)战舰部署函数报错排查
问题诊断
你遇到的Invalid direction报错是代码中多处逻辑错误共同导致的,核心问题如下:
1. navios数组指针偏移错误(main函数)
lw t6, 0(t5) # n = *np addi t5,t5,1 # 错误!每个元素是4字节的.word,读完第一个值后指针应该加4
你读完战舰总数后只给指针加了1,导致后续读取的战舰方向、长度等参数全是错位的错误值,自然无法通过方向校验。
2. 方向判断寄存器混淆(insert_ships函数)
方向参数存储在寄存器a0,长度参数存储在a1,但你判断方向时错用了a1:
bne a1, t1, endif0 # 错误!应该判断a0(dir)是否等于1,不是a1(size) ... bne a1, zero, endif2 # 错误!应该判断a0(dir)是否等于0,不是a1(size)
不管方向参数是0还是1,这两个判断都会跳过合法的垂直/水平处理分支,最终走到非法方向的校验逻辑。
3. 方向校验前参数被覆盖
你在处理越界、重叠错误时会给a0赋值错误字符串的地址,把原本存储的方向参数直接覆盖:
la a0, arrume_sobreposicao # 修改了a0,原始dir值丢失 ... la a0, erro_nav # 同样会修改a0 ... li t1, 1 ble a0, t1, endif5 # 此时a0已经不是原始方向值,判断完全失效
4. 函数返回逻辑错误
insert_ships函数最后直接调用ecall 10退出程序,而不是用ret返回main函数,哪怕前面逻辑正确,处理完第一艘战舰也会直接终止运行。
5. 矩阵初始化失效
main函数中初始化矩阵为~的代码被注释了,未初始化的矩阵内存全是随机值,后续判断战舰重叠的逻辑会完全失效:
#sw a0,0(t3) # 这行被注释,矩阵没有被正常初始化为'~' lbu a0,0(t3)
修复建议
- 把main函数中
addi t5,t5,1改为addi t5,t5,4 - 把判断方向的两个条件中的
a1改为a0 - 把方向合法性校验移到insert_ships函数最开头,避免a0被修改后判断失效
- insert_ships结尾用
ret返回,不要直接退出程序 - 取消矩阵初始化代码的注释,正常初始化矩阵为
~ - 修复循环判断条件的寄存器错误,比如for3中
bge t1,a2, endfor3应该改为bge t1,a1, endfor3(和长度比较,不是和行号比较)
内容的提问来源于stack exchange,提问作者user10459894
相关产品推荐
相关产品推荐

