指令编码
31..20
imm[11:0]
19..15
rs1
14..12
funct3
11..7
rd
6..0
opcode
LD 使用 opcode 0000011(0x03)、funct3 011。rs1 字段选择源寄存器,12 位立即数提供第二操作数,rd 选择目标寄存器。
格式: I-type
opcode: 0000011 (0x03)
funct3: 011 (0x3)
指令行为说明
LD 指令在 RV64I 中采用 I 型格式(opcode=0000011, funct3=011),从地址 rs1 加符号扩展 12 位偏移量处加载 64 位值到 rd。在 RV32 的 Zilsd 扩展中,同一助记符/编码表示“加载双字到寄存器对”:64 位值写入 rd 和 rd+1,且 rd 必须为偶数。自然对齐地址为 8 字节倍数;Zilsd 中 4 字节对齐但非 8 字节对齐的访问可拆为两个原子 word 访问,并仍可能产生 misaligned trap。
常见使用场景
RV64专用操作
结合 «ld x10, 16(x2) # load 64-bit value from stack at offset 16» 等实际代码理解该场景。
数据加载
结合 «ld x10, 16(x2) # load 64-bit value from stack at offset 16» 等实际代码理解该场景。
使用前检查清单
语法检查
- 确认当前指令格式为 I-type。
- 确认操作数排列顺序与示例一致。
语义检查
- 确认目标寄存器用途和调用约定兼容。
- 确认该指令不是伪指令展开后的底层形式。
容易混淆 / 常见误区
RV64I 语义是单个 64 位寄存器加载;RV32 Zilsd 语义是偶/奇寄存器对加载。
Zilsd 中 rd 必须为偶数;奇数 rd 编码为保留。
偏移量为符号扩展 12 位;最可移植的是 8 字节自然对齐访问。