[英]How do you move data at one memory location to another in RISCV programming?
一般来说,我是 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 位立即数,当与 I-Type 指令(提供 12 位立即数)按顺序组合时,可以在 2 条指令中实现 32 位立即数。
AUIPC
将高位立即数添加到 PC 还提供 20 位立即数并将立即数添加到 PC 以形成 PC 相对寻址能力。
此外,我们还可以使用班次和其他指令。
即使该负载是可编码的, x
也是一个错字,因为您想要 x4000000,即 67,108,864 10 (不是 x67108864)。
该存储指令将编码是可以的。
我对易失性指针的事情有/有问题,但它在这里有效。 您可以让工具向您展示如何操作...有时...
#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 组合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.