为说明跳转指令B的反汇编分析方法,这里以一段代码为例:
.text .global _start _start: b step1 step1: b step1
然后将这段代码链接到0x00000000地址,生成反汇编文件:
反汇编代码如下:
00000000 <_start>: 0: eaffffff b 4 4: e59ff000 ldr pc, [pc, #0] ; c <step2+0x4> 8: eafffffe b 8 <step2> c: 00000008 andeq r0, r0, r8
先看 源代码中第一条指令“b step1”。b跳转指令是个相对跳转指令,其机器码格式如下:
- [31:28]位是条件码。
- [27:24]位为“1010”表示b跳转指令,为“1011”表示bl跳转指令。
- [23:0]表示偏移地址。
使用b或bl跳转时,下一条指令的地址是这样计算的,将指令中24位带符号的补码扩展为32位(扩展其符号位);然后将此32位数左移2位;最后将得到的值加到pc寄存器中,即得到跳转的目标地址。
比如第一条指令“b step1”的机器码为eaffffff。
- 24位带符号的补码为0xffffff,将其扩展为32位得到0xffffffff。
- 将此32位左移2位得到0xfffffffc,其原码就是-4。
- pc的值是当前指令的下两条指令的地址,加上上面得到的-4,这恰好是step1的地址。
从上面的分析发现,b跳转指令依赖于当前pc寄存器的值,不依赖于代码存储的位置。需要注意的是:“b 4”指令不是跳到绝对地址0x4处执行,而是通过上面的3个步骤来计算出来的。
注:以上内容摘抄自《嵌入式Linux应用开发》