指令行为说明
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。
LD 指令解析与执行动画
从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。
rd
imm
rs1
ld,()
执行环境
a0(x10)
0x0000000000001000
mem[0x0000000000001000]
0x12345678
仅当有效地址不是 8 的倍数时使用此 EEI 分支;自然对齐访问不得引发地址未对齐异常。
31..20
19..15
14..12
11..7
6..0
000000000000
imm[11:0]
01010
rs1
011
funct3
00101
rd
0000011
opcode
执行数据路径
instruction
0x00053283
opcode
0000011 -> LOAD
funct3
011 -> LD
rd / base
t0(x5) / a0(x10)=0x0000000000001000
offset
000000000000 -> 0; ea=0x0000000000001000 (naturally aligned (8-byte))
load
64-bit 0x0000000012345678 -> sign extend
x5
t0(x5) = 0x0000000012345000
当前步骤
概念步骤:拿到 32-bit 指令编码
机器码按当前指令格式切成字段,动画从 encoding/decode 开始。
encoding: 0x00053283
syntax : ld t0(x5), 0(a0(x10))
result : t0(x5) = 0x0000000012345000
架构可见结果
t0(x5) = 0x0000000012345000
该 LD 动画只建模 RV64I 的单寄存器 64 位加载;RV32 Zilsd 使用同一助记符和编码但操作偶/奇寄存器对,其独立条件见静态页面内容。
常见使用场景
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» 等实际代码理解该场景。
使用前检查清单
语法检查
- 确认立即数字段在有效范围内。
- 确认源寄存器 rs1 指向正确的操作数。
语义检查
- 确认立即数符号扩展是否符合预期。
- 确认结果寄存器 rd 的用途是否明确。
容易混淆 / 常见误区
RV64I 语义是单个 64 位寄存器加载;RV32 Zilsd 语义是偶/奇寄存器对加载。
Zilsd 中 rd 必须为偶数;奇数 rd 编码为保留。
偏移量为符号扩展 12 位;最可移植的是 8 字节自然对齐访问。