B指令的汇编形式为:
b label
:
:
label:
mov r1,r2
mov r2,r3
从汇编指令的书写形式上,确实是一条绝对跳转指令,但是实际上汇编在将“B label”这条指令翻译为机器指令的时候,会计算label相对于当前PC的偏移,将这个偏移值放到机器码中,所以实际上,B跳转指令为相对跳转指令。用相对跳转指令就可以编写位置无关的代码。
这个范围的限制呢,是要看指令编码了,B指令的编码是这样的
31..28:条件码
27..25:101
24:是否链接标志
23..0:跳转的地址
地址值呢,只有24位长度,因为ARM指令是字对齐的,最低2位永远为0,所以最大值也就是前后32MB的范围,
不过虽然这条指令是有32MB的限制,但是超出32MB时,也是可以使用的,我们也不知道链接器会把目的块放到哪里,必要时链接器会自动添加一些代码实现长距离的跳转。
所以在实际使用中,不用去管这个32MB的限制,当成一个绝对跳转指令就行了。
你都反汇编了,就可以对着指令表看看ea000012是啥意思啊。b指令最后24位左移两位,去掉个最高位是符号位,就是要跳的地址,但因为预取,所以还要加个8.
ea000012后面的0x12左移两位加个8就是下一条指令的地址,就是0x50,你看看你的0x50是不是reset。
32M那个就是因为24位左移两位去掉最高位剩25位,2^25=32M
最近在家看了一部 <我的丑娘>感触很深 挺激动的 世界上母爱是最巨大的 在这里盼望友人们要多孝敬父母 时光关联 就写这多 呵呵,美丽集中营