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