我是RISC-V编程和汇编编程的新手。
我想把一个32位字从内存中的地址0x04000000
移动到另一个地址0x00000190
。
我是否必须首先将数据加载到GPR(使用lw
?),然后存储到新地址(例如sw
?)?或者有更直接的方法吗?
这些说明有什么问题吗?
lw x8, 0(x67108864)
sw x8, 192(x0)
感谢你将无法在RISC V上编码加载指令,因为它只允许12位的直接/偏移,而且,它必须遵循通常写为disp(reg)
的常规基数+位移形式。有些汇编程序通过将该行扩展成多条机器码指令来接受这种长度的立即指令。
还有两个额外的指令可以帮助形成更大的直接指令:
-
LUI
- Load Upper Immediate提供20位的Immediate,当与I-Type指令(提供12位的Immediate)按顺序组合时,可以在2条指令中实现32位的Immediate。 -
AUIPC
- Add upper immediate to PC也提供20位的immediate,并将该immediate添加到PC,形成PC相对寻址能力。
此外,我们还可以使用移位和其他指令。
即使该加载是可编码的,x
也是一个输入错误,因为您想要x4000000,也就是67,108,86410(而不是x67108864)。
该存储指令将编码为ok。
我有/易失性指针的事情的问题,但它在这里工作。你可以让工具告诉你怎么做……有时候……
#define ONE (*((volatile unsigned int *)0x04000000))
#define TWO (*((volatile unsigned int *)0x00000100))
void fun ( void )
{
TWO=ONE;
}
,对我来说,是
00000000 <fun>:
0: 040007b7 lui x15,0x4000
4: 439c lw x15,0(x15)
6: 10f02023 sw x15,256(x0) # 100 <fun+0x100>
a: 8082 ret
您通常可以使用li伪指令,汇编程序将为您选择正确的lui, addi组合。