【ARM 常见汇编指令学习 1 — 跳转指令 BL 与 BLR 区别】

【ARM 常见汇编指令学习 1 — 跳转指令 BL 与 BLR 区别】ARM中跳转指令主要分为无条件跳转和有条件跳转,有条件跳转是一种根据特定条件进行跳转的指令

【ARM

下篇文章:ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP

跳转指令简介

ARM 中跳转指令主要分为无条件跳转和有条件跳转,有条件跳转是一种根据特定条件进行跳转的指令。它会根据条件码寄存器(Condition Code Register)中的状态,判断是否满足特定条件,然后根据条件的结果决定是否进行跳转。无条件跳转是一种无条件地改变程序执行流程的指令。它会直接跳转到指定的地址,而不需要任何条件判断。

  • 有条件跳转指令,有条件跳转指令的方式很固定。
  • 无条件跳转指令,有常见如下4种:
    • 直接跳
    • 链接跳
    • 间接跳
    • 返回跳,

ARM 跳转指令集列表

类型 指令 介绍
条件分支 B.cond Branch conditionally
条件分支 CBNZ Compare and Branch if NonZero
条件分支 CBZ Compare and Branch if Zero
条件分支 TBNZ Test bit and Branch if NonZero
条件分支 TBZ Test bit and Branch if Zero
无条件分支 B Branch uncondition
无条件分支 BL Branch with Link
无条件分支 BLR Branch with Link to Register
无条件分支 BR Branch to Register
无条件分支 RET Return from subroutine

其中指令的关键字:

  • B 表示分支跳转指令,
  • cond 表示条件跳转,
  • L 表示链接,
  • R 表示从寄存器中查找跳转地址,
  • RET 则返回L类型保存的地址。

BL 与 BLR 的区别

BL 和 BLR 执行结果是将 PC 寄存器值的下一个值(也就是PC+8)放到链接寄存器 LR中, 然后将目的子程序的地址放到 PC 中。 BLR的结果 与 BL类似,但是新的PC的值是从特定的寄存器(如x0)取得

如下是使用 BLR 的例子:

  // Move startup address into a data register
  ldr   x4, =ASM_PFX(CEntryPoint)

  // Set the frame pointer to NULL so any backtraces terminate here
  mov   x29, xzr

  // Jump to PrePiCore C code
  // x0 = MpId
  // x1 = UefiMemoryBase
  // x2 = StacksBase
  blr   x4

_NeverReturn:
  b _NeverReturn

下篇文章:ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP

推荐阅读:
https://reviews.llvm.org/D81402

今天的文章【ARM 常见汇编指令学习 1 — 跳转指令 BL 与 BLR 区别】分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83920.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注