lh
lyszt.net 更详细地介绍了 lh 和其他 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
描述
lh 从内存中加载一个半字。一个字节是 8 位,并拥有自己的地址,这使其成为最小的可寻址单位。一个字是 4 字节,即 32 位,而半字是它的一半:2 字节,即 16 位。lh 读取 16 位,而 lw 读取 32 位。寻址方式与 lw 相同:一个基址寄存器加上一个常量偏移量(参见 lw 页面)。形式如下所示。
lh rd, offset(rs1)
一个寄存器保存 32 位,因此 16 位加载必须填充剩余的 16 位。lh 使用符号扩展。它读取 16 位值的最高位,该位标记有符号数的符号,并将该位复制到寄存器的所有 16 个高位中。该值保留其符号,因此 16 位的 -3 会以 32 位的 -3 到达。
对于有符号 16 位数据,例如可能为负的音频采样或传感器读数,请使用 lh。它的搭档 lhu,其中 u 表示无符号,用 0 填充高位,这适合从不为负的数据。位模式 0x8000 用 lh 加载会变成 -32768,而用 lhu 加载会变成 +32768。内存中的位保持不变,由加载决定其含义。
RISC-V 手册将 lh 定义为从内存加载一个 16 位值,并在将其存储到 rd 之前将其符号扩展为 32 位。有效地址是寄存器 rs1 加上符号扩展的 12 位偏移量。当访问的地址能被该访问的大小(以字节为单位)整除时,该访问是自然对齐的,因此半字访问在偶数地址处对齐。
半字是 2 字节,因此它们的数组位于偏移量 0、2、4 处,指针通过加 2 来遍历它们。
示例
.data val: .half -5 .text la t0, val lh t1, 0(t0) # t1 = -5 (sign-extended)
