ARM跳转指令B的反汇编分析

时间:2021-10-23 16:49:40

为说明跳转指令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跳转指令是个相对跳转指令,其机器码格式如下:

ARM跳转指令B的反汇编分析

  1. [31:28]位是条件码。
  2. [27:24]位为“1010”表示b跳转指令,为“1011”表示bl跳转指令。
  3. [23:0]表示偏移地址。

使用b或bl跳转时,下一条指令的地址是这样计算的,将指令中24位带符号的补码扩展为32位(扩展其符号位);然后将此32位数左移2位;最后将得到的值加到pc寄存器中,即得到跳转的目标地址。

比如第一条指令“b step1”的机器码为eaffffff。

  1. 24位带符号的补码为0xffffff,将其扩展为32位得到0xffffffff。
  2. 将此32位左移2位得到0xfffffffc,其原码就是-4。
  3. pc的值是当前指令的下两条指令的地址,加上上面得到的-4,这恰好是step1的地址。

从上面的分析发现,b跳转指令依赖于当前pc寄存器的值,不依赖于代码存储的位置。需要注意的是:“b 4”指令不是跳到绝对地址0x4处执行,而是通过上面的3个步骤来计算出来的。


注:以上内容摘抄自《嵌入式Linux应用开发》