ARM的B,BL跳转指令偏移值计算

问题:

.text:00637C80  E5 34 42 EB       BL     __mulsf3
.text:00637CA4 DC 34 42 EB      BL     __mulsf3


.text:016C501C                             EXPORT __mulsf3
.text:016C501C FF C0 A0 E3       MOV     R12, #0xFF


偏移值如何计算出来?


原理:

假设跳转指令处的地址是A,跳转目标处的地址是B.
B,BL指令保存的是偏移地址,这个地址的计算方法是:
1.B-(A+8).A+8是因为ARM的流水线使得指令执行到A处时,PC实际的值是A+8.
2.第一步得到的值是4的倍数,因为ARM的指令是4对齐的,即最低两位为00.于是将这个值右移两位.
3.得到最终偏移

执行时:
1.取出偏移
2.左移两位
3.加入PC,这时PC的值刚好为目标处的地址值,即目标地址指令进入取指,流水线前两级被清空


举例:

.text:00637CA4 DC 34 42 EB      BL     __mulsf3
.text:016C501C                             EXPORT __mulsf3

计算偏移公式: (B-(A+8))/4

(0x016C501C-(0x637CA4+8))/4 = 0x4234DC



注意事项:

这个公式只针对4个字节的ARM有效。


ARM指令跳转回自身

000080E0 FE FF FF EA             B       start



.THUMB指令跳转回自身

 .text:0000877E                         loc_877E                                ; CODE XREF: .text:loc_83F6j
.text:0000877E                                                                 ; .text:loc_877Ej
.text:0000877E FE E7                                   B       loc_877E 




你可能感兴趣的:(ARM的B,BL跳转指令偏移值计算)