ARM汇编转RISC-V汇编报错求助:Vitis编译错误修复
ARM转RISC-V汇编编译错误修复
原ARM汇编代码
.text .global main .equ ADD1, 0x40000000 .set ADD2, 0x40000004 main: ldr r1,=ADD1 ldr r2,=ADD2 loop: ldr r0,[r1] str r0,[r2] b loop .end
尝试编写的RISC-V汇编代码
.global main .data ADD1: .word 0x40000000 ADD2: .word 0x40000004 .text main: la t0, ADD1 lw a1, 0(t0) la t1, ADD2 sw a1, 0(t1) j main .end
编译错误信息
../src/PROJ1.S:9: Error: register expected, but saw 't0,ADD' ../src/PROJ1.S:9: Error: register expected, but saw '0,ADD1' ../src/PROJ1.S:9: Fatal error: missing operand make: *** [src/subdir.mk:23: src/PROJ1.o] Error 1
错误原因分析
- 语法问题:报错指向第9行的
la t0, ADD1,GNU汇编器(GAS)对RISC-V的la指令语法要求严格,部分版本不支持寄存器与符号间带逗号的写法,需用空格分隔操作数。 - 逻辑偏离:原ARM代码是将ADD1、ADD2作为固定内存地址常量使用,而你错误地将其定义为.data段的变量,导致逻辑完全不符。
修复后的正确RISC-V代码
.global main .equ ADD1, 0x40000000 .equ ADD2, 0x40000004 .text main: li t0, ADD1 # 加载ADD1地址常量到t0 li t1, ADD2 # 加载ADD2地址常量到t1 loop: lw t2, 0(t0) # 读取ADD1地址处的内存值 sw t2, 0(t1) # 将值写入ADD2地址处 j loop # 无限循环执行读写操作
代码说明
- 常量定义:沿用原ARM的
.equ定义ADD1、ADD2为固定内存地址,无需放入.data段,保持原逻辑的地址常量属性。 - 指令选择:用
li伪指令直接加载32位常量到寄存器,避免la指令的语法兼容性问题,li会自动适配RISC-V的指令格式拆分为合法指令。 - 逻辑还原:恢复原ARM代码的循环读写逻辑,无限读取指定地址的内容并写入另一地址。
内容的提问来源于stack exchange,提问作者Harry Betts
相关产品推荐
相关产品推荐

