|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
B 和 BL 指令都是 相对跳转(短跳转) 指令,通过偏移量跳转, 最大跳转距离是 ±32M, l1 ]0 @# g `
使用 mov pc, <>可以实现 对跳转(长跳转)(不会保存当前 PC 值) [7 \4 T' d: F5 N' H
关于B指令和BL指令最大跳转距离是 ±32M:5 ]( q. U9 a9 X: ?; p
ARM汇编每条指令占用 4byte,生成机器码 B 、BL存放在bits[31:24], bits[23:0]是立即数空间,可以表示 2^24个地址。由于每条汇编指令占用4byte字节(最低两位都为 0),因此可以使用 24位二进制数来表示 26 位的寻址空间。% d- J$ ^: T! b/ i$ }8 _+ N9 D
B指令和BL指令的区别:
8 Z9 `7 t, W O/ C) g3 K: G3 zB指令在使用时不会对当前 PC 值进行保存,为保证跳转指令执行后能正常返回,要手动对其进行保存
# r2 j! E a0 j# P6 CBL (带连接的跳转指令)能够在跳转时对当前 PC 值自动进行保存。9 Q/ v; F; j. f! `1 S2 r6 A
Thumb的B系列指令跳转范围只有256字节,然而大多数情况下跳转范围都会大,所以一般inlinehhok采用LDR PC, [PC, ?]构造跳转指令。
9 b, @5 C' f' a0 K8 E s* GB,BL指令保存的是偏移地址,这个地址的计算方法是:- b, z: a/ l8 f
假设跳转指令处的地址是A,跳转目标处的地址是B.
$ Y# x1 }3 g: c& J; k" y/ h1.B-(A+8).A+8是因为ARM的流水线使得指令执行到A处时,PC实际的值是A+8.: d$ L1 d7 x3 C8 S0 f+ Q. k& M! o
2.第一步得到的值是4的倍数,因为ARM的指令是4对齐的,即最低两位为00.于是将这个值右移两位.
* s" A8 {/ m5 Q: V& q3.得到最终偏移9 U- O8 V( c- S8 B7 R! H8 m
所以跳转的范围为正负32M(-2^25 ~ 2^25有一位符号位)
0 d& [/ k) Y6 z6 r$ T3 ^5 R f6 ?4 \( Q: M) E% g1 y
; z$ B4 z9 F! \1 R7 y |
|