假设跳转指令处的地址是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的值刚好为目标处的地址值,即目标地址指令进入取指,流水线前两级被清空
bl test;
未连接时的二进制形式是f7fffffe,连接后是f936f003.我知道偏移大概是0x3280左右。
问题是f936f003这个怎么表示的偏移大概0x3280,左移什么的都对不上。
详细过程。f003 = 1111000000000011 表示偏移地址的高位,为第一条指令:后11为偏移地址:00000000011 补0 0000000000000011 = 0003f936 = 1111100100110110 表示偏移地址的低位,为第二条指令后11为偏移地址:00100110110 补0 0000000100110110 = 01360003 <<12 = 0011 0000 0000 0000 = 30000136 <<1 = 0000 0010 0110 1100 = 026c0011 0000 0000 0000 | 0000 0010 0110 1100 = 326c
http://www.decell.org/article.asp?id=2
http://read.pudn.com/downloads114/sourcecode/embed/480189/h/arch/arm/dsmArmLib.h__.htm
http://bbs.csdn.net/topics/290014122