RISCV指令

Ann*_*119 6 assembly riscv

我是 riscv 的新手,我对 la 和 lw 感到困惑。

我知道它la代表加载地址并lw代表加载字。如果VAL的地址是, VAL的0x100数据值是,x3应该存储0x11 ,x4应该存储0x11吗?0x110x100

la x7, VAL
sw  x3, 0(x7)
lw  x4, VAL
bne x4, x3
Run Code Online (Sandbox Code Playgroud)

小智 6

la t0, SYMBOL是一条汇编器伪指令,将 的地址放入SYMBOLt0。根据寻址模式,它扩展为类似

lui t0, SYMBOL[31:12]
addi t0, t0, SYMBOL[11:0]
Run Code Online (Sandbox Code Playgroud)

其中SYMBOL[31:12]是 的高位SYMBOLSYMBOL[11:0]是 的低位SYMBOL——这些不是有效的汇编语法,并且可以使用一些技巧来使用符号扩展来使其完全正确。

lw t0, SYMBOL是一条汇编伪指令,它将地址处的内存值SYMBOL放入t0。根据寻址模式,它扩展为类似

lui t0, SYMBOL[31:12]
lw  t0, SYMBOL[11:0](t0)
Run Code Online (Sandbox Code Playgroud)

具体区别在于,lw执行从内存的加载,而la仅生成地址。序列

la t0, SYMBOL
lw t0, 0(t0) # load word from memory address 0(t0)
Run Code Online (Sandbox Code Playgroud)

在功能上等同于

lw t0, SYMBOL
Run Code Online (Sandbox Code Playgroud)

但需要额外的指令,特别是

lui t0, SYMBOL[31:12]
addi t0, t0, SYMBOL[11:0]
lw t0, 0(t0)
Run Code Online (Sandbox Code Playgroud)

lui t0, SYMBOL[31:12]
lw t0, SYMBOL[11:0](t0)
Run Code Online (Sandbox Code Playgroud)

这些都应该是RISC-V 汇编程序员手册中的文档,但这始终是一项正在进行的工作。如果您发现缺少,请随时提交补丁或提出问题。


Eri*_*idt 3

la计算指针大小的有效地址,但不执行任何内存访问。有效地址本身就是加载到 x7 中的地址。

(另请注意,这la是一条伪指令,可以扩展为两条指令,具体取决于VAL序列计算有效地址,这就是其结果(不执行内存访问)。)

lw还计算有效地址;但是,它使用字大小的内存访问中的有效地址,并且该内存访问的结果是加载到 x4 中的值。

lb会做同样的事情,lw只是内存访问是字节大小的。


就您的代码序列而言,其中的值x3(无法从您的代码片段中确定)将存储到内存中的位置 0x100-0x103(这是一个字大小的存储)。

lw重新加载 写入的值sw。(请注意,lw在这种情况下, 也可能根据 展开为多条指令VAL,而sw无论 怎样, 都是单个指令VAL。)

bne尽管缺少目标标签)不会分支。