首页
学习
活动
专区
圈层
工具
发布

RISCV指令
EN

Stack Overflow用户
提问于 2018-11-21 05:17:15
回答 3查看 18.1K关注 0票数 3

我是新来的,我在洛杉矶和lw之间搞混了。

我知道la代表load地址,lw代表load word。如果VAL的地址是0x100,而VAL的数据值是0x11,那么x3是否应该存储0x100E 111x4<代码>E 212存储0x11?

代码语言:javascript
复制
la x7, VAL
sw  x3, 0(x7)
lw  x4, VAL
bne x4, x3
EN

回答 3

Stack Overflow用户

发布于 2019-01-02 18:58:11

la t0, SYMBOL是将SYMBOL的地址放入t0的汇编程序pesudo指令。根据寻址模式的不同,它扩展到如下

代码语言:javascript
复制
lui t0, SYMBOL[31:12]
addi t0, t0, SYMBOL[11:0]

其中SYMBOL[31:12]SYMBOL的高比特,而SYMBOL[11:0]SYMBOL的低位--这些都不是有效的汇编语言语法,还有一些技巧可以利用符号扩展来使这完全正确。

lw t0, SYMBOL是一个汇编程序伪指令,它将地址SYMBOL处的内存值放入t0中。根据寻址模式的不同,它扩展到如下

代码语言:javascript
复制
lui t0, SYMBOL[31:12]
lw  t0, SYMBOL[11:0](t0)

具体而言,区别在于lw从内存中执行负载,而la只生成一个地址。序列

代码语言:javascript
复制
la t0, SYMBOL
lw t0, 0(t0) # load word from memory address 0(t0)

在功能上等价于

代码语言:javascript
复制
lw t0, SYMBOL

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

代码语言:javascript
复制
lui t0, SYMBOL[31:12]
addi t0, t0, SYMBOL[11:0]
lw t0, 0(t0)

vs

代码语言:javascript
复制
lui t0, SYMBOL[31:12]
lw t0, SYMBOL[11:0](t0)

所有这些都应该是RISC-V汇编程序员手册中的文档,但这始终是一项正在进行的工作。如果您发现这是缺乏的,那么可以随意提交补丁或打开一个问题。

票数 6
EN

Stack Overflow用户

发布于 2018-11-22 16:26:00

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

(还请注意,la是一个伪指令,它可能扩展为两个指令,这取决于VAL --尽管如此,该序列计算有效地址,这是它的结果(不执行内存访问)。

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

lb将执行与lw相同的操作,只不过内存访问是字节大小的。

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

lw将重新加载由sw. 编写的值(请注意,在这种情况下,lw也可能扩展为多个指令,这取决于VAL,而sw是一个指令,而不管VAL)。

bne (虽然缺少目标标签)不会分支。

票数 3
EN

Stack Overflow用户

发布于 2021-11-23 01:01:43

la指令是一个伪指令,它得到符号的地址。在规范中,它指的是:

出处:规范第1卷,无特权规格诉20191213 (https://riscv.org/technical/specifications/)

la将因符号不同而有所不同:

  1. 当la中的符号是非PIC(非位置独立代码)时,la将被解析为auipc和addi。
  2. 当符号为PIC(独立位置代码)时,la将被解析为auipc和l{w\d}。符号将被扩展为GOTsymbol,GOT表示:全局偏移表。RV32I使用lw,RV64I使用ld。

lw指令将32位值从内存加载到rd中.

因此,它不仅是一个简单的“地址”与“价值”问题,还取决于平台和符号。因为在不同的情况下,la会作为不同的指令被解决。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53405655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档