|
|
希望对你有帮助6 p# _8 `' N; m- [2 x- p4 p* Z
- z. ~3 X4 d. d$ e' Q4 f$ J7 v首先看看跳转指令B的指令编码情况:
' O: N7 k# t0 X# s+ t! O- t3 C7 D9 M9 E& o# C3 A
9 u/ C2 V5 Y M( T2 h
b0 z& O# e: A- U6 cB指令的编码是这样的4 ~8 M" Q7 @" b( V# `) a
31..28:条件码( J; t m' ?+ H$ e, A
27..25:101' o5 B6 O+ p2 A+ N2 B/ h
24:是否链接标志 Z. l5 M$ o( a3 O6 h
23..0:跳转的地址- b6 ~1 T# c& Y: `; Q# W9 z, m
8 c8 d. x/ [; e( ?, |+ Y也就是说跳转的地址位为23:0位共24位,其中一位为符号位也就只有正负8M的跳转地址而已,32M是怎么来的呢' w0 `0 ^7 e1 n; a' M9 ^% `: {
我是这么理解的,因为ARM中要求指令是字对齐的,也就是32位对齐,指令起始地址末尾两位1:0为00,而寄存器R15程序计数器pc每次跳转地址都要加4,保证了跳转的指令末两位为00,而23:0并不保证这个规律,所以就将这24为左移2位,也就是在末尾加两个0变成了26位,此时其中一位为符号位所能表示的跳转范围就变成了正负32M了" _/ U U5 k* m" r, r' e( i
|
|