la伪

la

伪
RISC-V 汇编 参考

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

描述

la 将某个东西的地址加载到寄存器中。该地址是一个内存位置,而存储在该位置的值是另一回事。这个名称代表 load address(加载地址)。

当你在内存中预留数据时,你会给它起一个像 arr 或 msg 这样的名字,这样就不必追踪原始的地址数字。这个名字就是一个标签,是内存地址的可读替代品。下一行将标签 arr 所标记的地址加载到 t0 中。它提供数组起始的位置,并不会读取数组的内容。

la t0, arr

加载和存储指令(lw、sw 以及其余指令)接受寄存器中保存的地址。在你能够读取或写入具名数据之前,它的地址必须位于寄存器中,而 la 会把它放到那里。读取值需要两条指令。la 找到数据所在的位置,lw 读取那里的内容。

RISC-V 手册将 auipc 描述为用于构建 pc 相对地址的指令。它指出,一条 auipc 后跟一个带 12 位偏移量的加载或存储,可以到达任何 32 位 pc 相对数据地址。

地址与其内容之间的区别,就像指针与值之间的区别一样。地址进入寄存器后,你通过向它加上偏移量来访问各个元素。该示例将一段文本的地址加载到 a0 中,这正是 print-string 服务所要求的。必须告诉它文本在哪里,它会从那里读取文本。la 是一条伪指令,由汇编器用几条真实指令构建而成。

展开为

auipc rd, hi(label)
addi  rd, rd, lo(label)

汇编器会将此伪指令替换为上面列出的真实指令或指令。

示例

.data
msg: .string "hi"
.text
la a0, msg     # a0 = address of msg