在ARM中使用B,BL跳转指令时。汇编后的机器码并不是直接读取跳转指令指向的地址,而是通过将当前的PC指令位置偏移一段后得到待跳转的地址值。
b跳转指令的机器码如下:
Cond | 1 | 0 | 1 | L | OFFSET |
bit [31:28] 条件码
bit [27:24] 指令码:"1010"代表 b 指令, “1011”表示bl指令。
bit [23:00] 表示偏移地址
反汇编后得到一段代码如下:
example.dis:
0: eaff ffff b 0x04
4:e59f f000 ldr pc ,[pc ,#0]
0xeaffffff 就是b指令的机器码。跳转地址计算:
1.将24位的offset补码扩展到32位-> 0xFFFFFFFF
2.左移2位-> 0xFFFFFFFC
3.补码转换为十进制,偏移-4。
将偏移量加到PC寄存器中,得到的值就是要跳转的地址。
第一条指令PC值应该是多少呢?
这里就要记住,在ARM体系中,PC值=当前指令地址 + 8。(见https://blog.csdn.net/aspenstars/article/details/72900811)
所以第一条指令地址PC:0+8=8;
跳转指令 PC: 8-4=4。
正好就是下一条指令的地址处。
因为b,bl 跳转时不依赖于代码所处的位置,所以被称为位置无关码。