10.1. 立即数加载

立即数(Immediate)是直接写入指令编码中的常量。

在 LoongArch64 架构中,由于 RISC(精简指令集计算机)设计强调指令格式简洁,大多数指令只能容纳16位或20位范围内的立即数。但在实际编程时,常常需要把32位甚至64位常量装入寄存器。

LoongArch64 提供 lu12i.w(加载高20位立即数)、ori(或运算)、lu32i.d(加载高32位)、lu52i.d(加载高52位)等指令,可逐步拼接较大的立即数。不过,手工编写这类序列既繁琐,也容易出错。立即数加载伪指令用于简化这一过程:汇编器负责拆分和生成实际指令,程序员只需关注要加载的常量值。

10.1.1. li 伪指令

10.1.1.1. 指令详解

li(Load Immediate)是 LoongArch64 中最常用的立即数加载伪指令,用于把常量写入通用寄存器。格式如下:

li.w  rd, immediate    # 加载32位立即数
li.d  rd, immediate    # 加载64位立即数

各参数含义如下:

  • li.ww 表示 word(32位),用于加载32位立即数。

  • li.dd 表示 double word(64位),用于加载64位立即数。

  • rd:目标通用寄存器,即 r0 至 r31 中的一个。

  • immediate:待写入的常量,可使用十进制或十六进制形式。

汇编器会根据立即数范围,自动选择较精简的展开方式:

  • 若立即数可由单条指令表示,汇编器会直接展开为一条真实指令。例如,imm 处于16位有符号范围(-32768 到 32767)时,可转换为 addi rd, $zero, imm;若处于16位无符号范围(0 到 65535),可转换为 ori rd, $zero, imm

  • 若立即数超出单条指令可表示范围,汇编器会拆分为多条指令序列,例如 lu12i.w + ori,或配合 lu32i.d 构造64位值。

  • 对于较小立即数,li.wli.d 的展开结果可能相同,例如 li.w $t0, 4 等价于 ori $t0, $zero, 4