下篇文章: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