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

如何加载32位常量0x1234ABCD至s0并存储到0x300起始内存?

修正寄存器加载指令并完成字节拆分存储

首先纠正你加载s0的错误指令:
你原来的lui s0, 0x1234B和addi s0, s0, 0xFFFFFBCD计算后得到的是0x1234ABCC,并非目标值0x1234ABCD。正确的加载方式是利用lui加载高20位,addi补充低12位:

lui s0, 0x1234A  # 将0x1234A加载到s0的高20位,此时s0 = 0x1234A000
addi s0, s0, 0xBCD  # 补充低12位,s0 = 0x1234A000 + 0xBCD = 0x1234ABCD

接下来完成字节拆分与存储,使用RISC-V的逻辑右移指令srl提取每个字节,再用sb(存储字节)指令写入对应内存地址:

# 提取最高字节0x12,存储到0x300
srl t0, s0, 24  # 将s0右移24位,t0 = 0x00000012
sb t0, 0x300(zero)  # 将t0的最低字节写入地址0x300

# 提取次高字节0x34,存储到0x301
srl t0, s0, 16  # 将s0右移16位,t0 = 0x00001234
sb t0, 0x301(zero)  # 写入地址0x301,sb仅取寄存器最低字节0x34

# 提取次低字节0xAB,存储到0x302
srl t0, s0, 8  # 将s0右移8位,t0 = 0x001234AB
sb t0, 0x302(zero)  # 写入地址0x302,取最低字节0xAB

# 提取最低字节0xCD,存储到0x303
sb s0, 0x303(zero)  # 直接取s0的最低字节0xCD,写入地址0x303

更高效的基址寄存器写法

如果不想重复写固定地址,可以先把基址存入临时寄存器,再用偏移量操作:

lui s0, 0x1234A
addi s0, s0, 0xBCD

lui t1, 0x0
addi t1, t1, 0x300  # t1 = 0x300(也可直接用伪指令li t1, 0x300)

srl t0, s0, 24
sb t0, 0(t1)  # 写入0x300

srl t0, s0, 16
sb t0, 1(t1)  # 写入0x301

srl t0, s0, 8
sb t0, 2(t1)  # 写入0x302

sb s0, 3(t1)  # 写入0x303

注:若你的汇编器支持伪指令li,可直接用li s0, 0x1234ABCD一步完成寄存器加载,无需拆分lui和addi。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:47:27