ARM体系—位置无关码

在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 跳转时不依赖于代码所处的位置,所以被称为位置无关码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值