lw

lw

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 lw 和其他 RISC-V 指令。

编码格式

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

描述

lw将值从内存复制到寄存器。32个寄存器构成处理器小而快速的工作区域。内存作为大型存储位于其旁:一长排编号的槽位,存放数组、文本和变量。槽位的编号就是它的地址。计算在寄存器中进行,数据在两次使用之间在内存中等待。

RISC-V只对寄存器进行算术运算,从不直接对内存进行运算,因此值必须先加载到寄存器中才能使用,使用后再存回。 lw执行加载。这个名字的意思是load word,而一个字是32位的值,即一个寄存器的宽度。

lw的形式如下所示。它取rs1中的值,即保存称为基址的内存地址的寄存器,加上offset,一个小常量,并将结果地址处的值读入目标寄存器rd。

lw rd, offset(rs1)

下一行加载t0中地址之后8字节处的值8。

lw t1, 8(t0)

RISC-V手册称RISC-V为加载-存储架构:加载和存储指令是唯一能访问内存的指令,算术指令只对寄存器进行操作。地址空间是32位并按字节寻址,加载的有效地址是寄存器rs1加上符号扩展的12位偏移量。执行环境,即程序运行所在的系统,决定内存是先保存最低有效字节(称为小端序)还是先保存最高有效字节(称为大端序)。当访问的地址能被访问的大小整除时,该访问是自然对齐的,对于字来说就是4字节。自然对齐的访问永远不会引发对齐错误。未对齐的访问按环境定义的方式运行,并且可能运行得非常慢。

偏移量之所以存在,是因为内存中的项以规则的间距排列。一个字是4字节,所以数组的连续元素相隔4字节,位于偏移量0、4、8等处。 la将数组的起始地址放入寄存器,改变偏移量即可读取不同的元素。示例加载数组的两个相邻值。偏移量0给出第一个值10,偏移量4给出下一个值20。

示例

.data
arr: .word 10, 20
.text
la t0, arr
lw t1, 0(t0)   # t1 = 10
lw t2, 4(t0)   # t2 = 20