一般來說,我是 RISC-V 編程和匯編編程的新手。
我想將一個 32 位字從記憶體中的一個地址移動0x04000000到另一個地址,比如說0x00000190。
我是否必須先將資料加載到 GPR(使用lw?),然后存盤到新地址(例如sw?)?還是有更直接的方法?
這些說明有什么問題嗎:
lw x8, 0(x67108864)
sw x8, 192(x0)
謝謝
uj5u.com熱心網友回復:
您將無法在 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)。
該存盤指令將編碼是可以的。
uj5u.com熱心網友回復:
我對易失性指標的事情有/有問題,但它在這里有效。您可以讓工具向您展示如何操作...有時...
#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 組合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495932.html
上一篇:SUB指令在匯編AVR中如何作業
