本文主要是介绍反汇编文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ARM反汇编机器码:32 bit,反汇编出来是用十六进制表示的。
[31:28]条件码
[27:24]为1010是表示b指令,1011是表示bl指令
[23:0]是偏移地址。2^24=32M bit,这就是b和bl的跳转只有32M的原因。
b和bl指令偏移地址的计算:首先将这24位带符号位的补码扩展成32位,注意这里的扩展是左边添加位“1”,当然得到的数也要把最高位当做符号位。再将得到的数左移两位,转换成十进制数(负数)就是偏移地址,也叫地址偏移量。最后将得到的值加到pc寄存器中(pc值是当前指令的地址加8)就得到跳转位置的地址,也就是绝对地址。这种跳转指令(位置无关码)是依赖当前pc寄存器的值,相当于以pc值为参考点来实现跳转。因此他不需要知道我的代码存储的位置。用程序代码解释就是:
if conditionPassed(cond)
{if(L==1)lr = address of the next instruction;pc = pc + (SignExtend(Signed_offset_24)<<2)
}
相比于b的跳转,还有一个ldr跳转指令。
ldr指令是从内存中的某处读出地址数据赋给pc实现跳转。例如ldr pc,[pc,#0],要访问的这个数据的地址是当前的pc加上0。实际中具体要加多少偏移值要根据编译时的连接地址(用-Ttest选项设置或者是用连接脚本)
绝对地址:与代码执行时存放的位置有关
相对地址:可想而知
这篇关于反汇编文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!