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

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

错误原因分析

  1. 语法问题:报错指向第9行的la t0, ADD1,GNU汇编器(GAS)对RISC-V的la指令语法要求严格,部分版本不支持寄存器与符号间带逗号的写法,需用空格分隔操作数。
  2. 逻辑偏离:原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:13:09