为何无法将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
验证结果
修正后:
lui x7, c>>44加载0x12345到x7的高20位,得到0x12345000ori x7, x7, 0x878按位或后得到0x12345878slli x7, x7,32左移32位得到0x1234587800000000- 最后和x6的
0x11223344执行or操作,得到正确的64位值0x1234587811223344
内容的提问来源于stack exchange,提问作者Ryan Pham
相关产品推荐
相关产品推荐

