如何加载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
相关产品推荐
相关产品推荐

