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

为何无法将64位值正确加载到RISC-V寄存器?

问题分析与修正

你的代码错误出在**addi指令的有符号立即数特性**上,具体原因和修复方案如下:

错误根源

RISC-V的addi指令使用12位有符号立即数,取值范围是-2048~2047(对应十六进制0x800~0x7FF)。

你要加载的高32位部分是0x12345878,其中通过(c & 0xfff00000000) >>32得到的是0x878,这个值的十进制是2168,超过了12位有符号数的最大值2047。此时0x878会被当作有符号负数(二进制最高位为1,代表-1928),执行addi时实际是做减法:

0x12345000 + (-0x788) = 0x12344878

这就是你得到错误结果的原因。

修复方案

将addi替换为**ori指令**——ori使用12位无符号立即数,会把立即数零扩展为64位后执行按位或操作,不会有符号扩展的问题。

修正后的代码如下:

;Use lui and addi/ori to store 0x1234587811223344 in x5

c:  EQU     0x1234587811223344
    lui     x6, (c & 0xffffffff) >> 12
    addi    x6, x6, c & 0xfff

    lui     x7, c >> 44
    ori     x7, x7, (c & 0xfff00000000) >> 32 
    slli    x7, x7, 32

    or      x5, x6, x7

验证结果

修正后:

  1. lui x7, c>>44 加载0x12345到x7的高20位,得到0x12345000
  2. ori x7, x7, 0x878 按位或后得到0x12345878
  3. slli x7, x7,32 左移32位得到0x1234587800000000
  4. 最后和x6的0x11223344执行or操作,得到正确的64位值0x1234587811223344

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:05:37