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.w:w表示 word(32位),用于加载32位立即数。li.d:d表示 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.w与li.d的展开结果可能相同,例如li.w $t0, 4等价于ori $t0, $zero, 4。