我是新来的,我在洛杉矶和lw之间搞混了。
我知道la代表load地址,lw代表load word。如果VAL的地址是0x100,而VAL的数据值是0x11,那么x3是否应该存储0x100和E 111x4<代码>E 212存储0x11?
la x7, VAL
sw x3, 0(x7)
lw x4, VAL
bne x4, x3发布于 2019-01-02 18:58:11
la t0, SYMBOL是将SYMBOL的地址放入t0的汇编程序pesudo指令。根据寻址模式的不同,它扩展到如下
lui t0, SYMBOL[31:12]
addi t0, t0, SYMBOL[11:0]其中SYMBOL[31:12]是SYMBOL的高比特,而SYMBOL[11:0]是SYMBOL的低位--这些都不是有效的汇编语言语法,还有一些技巧可以利用符号扩展来使这完全正确。
lw t0, SYMBOL是一个汇编程序伪指令,它将地址SYMBOL处的内存值放入t0中。根据寻址模式的不同,它扩展到如下
lui t0, SYMBOL[31:12]
lw t0, SYMBOL[11:0](t0)具体而言,区别在于lw从内存中执行负载,而la只生成一个地址。序列
la t0, SYMBOL
lw t0, 0(t0) # load word from memory address 0(t0)在功能上等价于
lw t0, SYMBOL但需要额外的指导,特别是
lui t0, SYMBOL[31:12]
addi t0, t0, SYMBOL[11:0]
lw t0, 0(t0)vs
lui t0, SYMBOL[31:12]
lw t0, SYMBOL[11:0](t0)所有这些都应该是RISC-V汇编程序员手册中的文档,但这始终是一项正在进行的工作。如果您发现这是缺乏的,那么可以随意提交补丁或打开一个问题。
发布于 2018-11-22 16:26:00
la计算指针大小的有效地址,但不执行任何内存访问。有效地址本身就是加载到x7中的地址。
(还请注意,la是一个伪指令,它可能扩展为两个指令,这取决于VAL --尽管如此,该序列计算有效地址,这是它的结果(不执行内存访问)。
lw还计算有效地址;但是,它在一个字大小的内存访问中使用有效地址,并且该内存访问的结果是加载到x4中的值。
lb将执行与lw相同的操作,只不过内存访问是字节大小的。
就您的代码序列而言,x3中的值(无法从代码片段中确定)将存储在0x100-0x103位置的内存中(这是一个字大小的存储)。
lw将重新加载由sw. 编写的值(请注意,在这种情况下,lw也可能扩展为多个指令,这取决于VAL,而sw是一个指令,而不管VAL)。
bne (虽然缺少目标标签)不会分支。
发布于 2021-11-23 01:01:43
la指令是一个伪指令,它得到符号的地址。在规范中,它指的是:

出处:规范第1卷,无特权规格诉20191213 (https://riscv.org/technical/specifications/)
la将因符号不同而有所不同:
lw指令将32位值从内存加载到rd中.
因此,它不仅是一个简单的“地址”与“价值”问题,还取决于平台和符号。因为在不同的情况下,la会作为不同的指令被解决。
https://stackoverflow.com/questions/53405655
复制相似问题