汇编跳转指令B、BL、BX、BLX和BXJ的区别
已针对原链接错误翻译并更正
跳转指令⽤于实现程序流程的跳转,在 ARM 程序中有两种⽅法可以实现程序流程的跳转:
(1) 使⽤专门的跳转指令。
(2) 直接向程序计数器 PC 写⼊跳转地址值。
通过向程序计数器 PC 写⼊跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使⽤
MOV PC,LR
等类似指令,可以保存下⼀条指令地址作为将来的返回地址值,从⽽实现在 4GB 连续的线性地址空间的⼦程序调⽤。
专门的跳转指令
B、BL、BX、BLX 和 BXJ:
跳转、带链接跳转(带返回的跳转)、跳转并切换指令集、带链接跳转并切换指令集(带返回的跳转并切换指令集)、跳转并转换到Jazelle 状态。
1、 B 指令
B 指令的格式为:
B{条件} ⽬标地址
B 指令是最简单的跳转指令。⼀旦遇到⼀个 B 指令,ARM 处理器将⽴即跳转到给定的⽬标地址,从那⾥继
续执⾏。注意存储在跳转指令中的实际值是相对当前PC 值的⼀个偏移量,⽽不是⼀个绝对地址,它的值由汇编器来计算(参考寻址⽅式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表⽰的有效偏移为 26 位(前后32MB 的地址空间)。以下指令:
B Label ;程序⽆条件跳转到标号 Label 处执⾏
CMP R1 ,# 0 ;当 CPSR 寄存器中的 Z 条件码置位时,程序跳转到标号 Label 处执⾏
BEQ Label
2、 BL 指令
BL 指令的格式为:
BL{条件} ⽬标地址
BL 是另⼀个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执⾏。该指令是实现⼦程序调⽤的⼀个基本但常⽤的⼿段。以下指令:
BL Label ;当程序⽆条件跳转到标号 Label 处执⾏时,同时将当前的 PC 值保存到 R14 中
3、 BLX 指令
BLX 指令的格式为:
BLX ⽬标地址
BLX 指令从ARM 指令集跳转到指令中所指定的⽬标地址,并将处理器的⼯作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当⼦程序使⽤Thumb 指令集,⽽调⽤者使⽤ARM 指令集时,可以通过BLX 指令实现⼦程序的调⽤和处理器⼯作状态的切换。
同时,⼦程序的返回可以通过将寄存器R14 值复制到PC 中来完成。
4、 BX 指令
BX 指令的格式为:
BX{条件} ⽬标地址
BX 指令跳转到指令中所指定的⽬标地址,⽬标地址处的指令既可以是ARM 指令,也可以是Thumb指令。总结
语法
op1{cond}{.W} <wbr />label
op2{cond} <wbr />Rm
其中:
op1
是下列项之⼀:
B
跳转。
BL
带链接跳转
BLX
带链接跳转并切换指令集。
op2
是下列项之⼀:
BX
汇编语言跳转指令跳转并切换指令集。
BLX
带链接跳转并切换指令集。
BXJ
跳转并转换为 Jazelle 执⾏。
cond
是⼀个可选的条件代码。 cond 不能⽤于此指令的所有形式。
.W
是⼀个可选的指令宽度说明符,⽤于强制要求在 Thumb-2 中使⽤ 32 位 B 指令。
label
是⼀个程序相对的表达式。
Rm
是⼀个寄存器,包含要跳转到的⽬标地址。
操作
所有这些指令均会引发跳转,或跳转到 label,或跳转到包含在 Rm 中的地址处。 此外:BL 和 BLX 指令可将下⼀个指令的地址复制到 lr(r14,链接寄存器)中。
BX 和 BLX 指令可将处理器的状态从 ARM 更改为 Thumb,或从 Thumb 更改为 ARM。BLX label ⽆论何种情况,始终会更改处理器的状态。
BX Rm 和 BLX Rm 可从 Rm 的位 [0] 推算出⽬标状态:
如果 Rm 的位 [0] 为 0,则处理器的状态会更改为(或保持在)ARM 状态
如果 Rm 的位 [0] 为 1,则处理器的状态会更改为(或保持在)Thumb 状态。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论