|
|
希望对你有帮助; P( b$ X% d. n+ z
( x/ D7 H$ y1 d% @2 R* z
首先看看跳转指令B的指令编码情况:# V+ y( r, @" M: {# a
* J3 `1 i, o* i6 b
+ ]% U" b2 w7 ^0 @) G' G& M
) R- w* D2 A6 ^, {: yB指令的编码是这样的
6 h" p/ q, O3 R& J3 k3 H% \% k31..28:条件码$ p: d1 v' d, s* \% g
27..25:101
$ K, A P8 \" N2 k24:是否链接标志. s( D m. @/ E5 f2 `7 F
23..0:跳转的地址
' I5 v6 F1 [' ]( R
/ k# b# C! `2 U1 I) ]: S也就是说跳转的地址位为23:0位共24位,其中一位为符号位也就只有正负8M的跳转地址而已,32M是怎么来的呢
* n: \9 X* h: x3 `1 j' s. J" u9 u- i我是这么理解的,因为ARM中要求指令是字对齐的,也就是32位对齐,指令起始地址末尾两位1:0为00,而寄存器R15程序计数器pc每次跳转地址都要加4,保证了跳转的指令末两位为00,而23:0并不保证这个规律,所以就将这24为左移2位,也就是在末尾加两个0变成了26位,此时其中一位为符号位所能表示的跳转范围就变成了正负32M了
+ l- G( S1 P1 {% b) h |
|