10.4. 函数返回与跳转
10.4.1. call 伪指令
功能:发起函数调用,并自动保存返回地址。
语法如下:
call target
call target, offset
参数说明:
target:调用目标,可以是标签、函数名或寄存器。offset:可选偏移量,用于 PC 相对寻址场景。
汇编器处理过程:
把下一条指令地址作为返回地址保存到
$ra。跳转到指定目标地址。
根据目标地址类型选择对应的实际指令序列。
底层实现示例:
# 对于 PC 相对寻址(最常见)
pcaddu12i $t0, %pcrel_hi(target) # 计算目标地址高20位
addi.d $t0, $t0, %pcrel_lo(target) # 添加低12位偏移
jalr.hb $ra, $t0, 0 # 跳转并保存返回地址
# 对于寄存器间接寻址
jalr.hb $ra, $target_reg, 0 # 跳转到寄存器中的地址
10.4.2. ret 伪指令
功能:从当前函数返回,并跳转到 $ra 保存的返回地址。
语法如下:
ret
汇编器处理过程:
生成跳转到
$ra的真实指令。通常展开为
jr.hb $ra(Jump Register with Hazard Barrier)。
底层实现示例:
jr.hb $ra # 跳转到 $ra 中的地址,并插入指令屏障
10.4.3. jr 伪指令
功能:跳转到寄存器保存的地址,可视为 ret 的底层跳转形式。
语法如下:
jr rs
jr rs, offset
参数说明:
rs:保存目标地址的寄存器。offset:可选偏移量,在 LoongArch 中通常为0。
与 ret 的主要区别如下:
ret固定以$ra作为跳转目标。jr可使用任意寄存器作为目标地址来源。ret表示函数返回语义,而jr是更通用的寄存器间接跳转。
10.4.4. 条件分支伪指令
LoongArch 常用条件分支伪指令如下。
| 伪指令 | 条件 | 说明 |
|---|---|---|
bltz |
rs < 0 (有符号) | Branch Less Than Zero |
bgtz |
rs > 0 (有符号) | Branch Greater Than Zero |
bgez |
rs >= 0 (有符号) | Branch Greater or Equal Zero |
blez |
rs <= 0 (有符号) | Branch Less or Equal Zero |