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

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)

修复建议
  1. 把main函数中addi t5,t5,1改为addi t5,t5,4
  2. 把判断方向的两个条件中的a1改为a0
  3. 把方向合法性校验移到insert_ships函数最开头,避免a0被修改后判断失效
  4. insert_ships结尾用ret返回,不要直接退出程序
  5. 取消矩阵初始化代码的注释,正常初始化矩阵为~
  6. 修复循环判断条件的寄存器错误,比如for3中bge t1,a2, endfor3应该改为bge t1,a1, endfor3(和长度比较,不是和行号比较)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:18:00