|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
B 和 BL 指令都是 相对跳转(短跳转) 指令,通过偏移量跳转, 最大跳转距离是 ±32M
/ E% E6 y- X0 ^: c9 B+ b' k使用 mov pc, <>可以实现 对跳转(长跳转)(不会保存当前 PC 值)
4 n) w* U" \8 T* C$ f关于B指令和BL指令最大跳转距离是 ±32M:' c2 U. J: l. ~: S9 D5 n2 E3 {6 _/ ]
ARM汇编每条指令占用 4byte,生成机器码 B 、BL存放在bits[31:24], bits[23:0]是立即数空间,可以表示 2^24个地址。由于每条汇编指令占用4byte字节(最低两位都为 0),因此可以使用 24位二进制数来表示 26 位的寻址空间。
# W7 F' [+ U0 C7 \. ^: U7 yB指令和BL指令的区别:
; F. a' U" h0 I% E3 @B指令在使用时不会对当前 PC 值进行保存,为保证跳转指令执行后能正常返回,要手动对其进行保存
6 H! c" l" B, R9 v, Q7 t( M" J, MBL (带连接的跳转指令)能够在跳转时对当前 PC 值自动进行保存。
9 n6 V7 ?. k& ~4 r: n% nThumb的B系列指令跳转范围只有256字节,然而大多数情况下跳转范围都会大,所以一般inlinehhok采用LDR PC, [PC, ?]构造跳转指令。) V5 [7 f; D2 f K6 Y
B,BL指令保存的是偏移地址,这个地址的计算方法是:
# s8 Z6 r2 E1 y% ]' }# U% U7 M8 \假设跳转指令处的地址是A,跳转目标处的地址是B.0 e5 X2 J* S2 z
1.B-(A+8).A+8是因为ARM的流水线使得指令执行到A处时,PC实际的值是A+8.- t4 Y) w3 Q( T, y4 v" @6 o9 S: G% X
2.第一步得到的值是4的倍数,因为ARM的指令是4对齐的,即最低两位为00.于是将这个值右移两位.
6 k. b u5 T; E3.得到最终偏移
, {: l* ^3 ~9 N5 F* `* Y+ V# V所以跳转的范围为正负32M(-2^25 ~ 2^25有一位符号位)
& H( n8 f+ a5 M7 y/ r4 D1 j; L" G1 C. [
I( P2 b$ o* ` |
|