ARM64汇编09 - 分支指令与模式切换

本文主要讨论两部分内容:

  • 分支指令,B、BL 等

  • v7中的模式切换,arm切thumb,thumb切arm。理解了模式切换就会明白为什么在做 inline hook 时,有些地址需要加上1,加上 1 的作用是什么。

B

B指令是无条件跳转指令。看描述是一个相对于PC地址的跳转,范围是使用 imm26 来描述。26 位表示的范围是 +/-128M。为啥会是 128M 呢?是因为最后的值还需要乘以4。

举个例子:

在 000000000001EDA4 处有一条 B 指令,执行完该指令之后就会直接跳转到 000000000001EDAC 处,IDA使用一条带箭头的线给出了提示。

之前在学习 so 的时候,写过一个死循环指令:

00 00 00 14

我们可以分析一下其具体的每一位:

00010100 00000000 00000000 00000000 ->
0 00101 00000000000000000000000000

因为是跳转到自己位置,所以 imm26 是 0,很好理解。

对比了一下 v7 与 v8 中的死循环指令,发现一个未曾注意到的区别:

v8: 00 00 00 14
v7: fe ff ff ea

在 v7 中,feffff 表示的是 -2,由于 pc = pc + 8,所以算下来,offset = 8 + (-2)* 4 = 0。

但是在 v8 中,offset 就直接是 imm26 的值,这是否说明在 v8 中,pc就是自身的值?暂时未找到具体文档,先留个疑问。

在 V7 中,存在 arm 与 thumb 指令,那么 B 指令跳转会发生模式切换吗?是不会的,编译器可以保证,除非你修改了指令代码,如果在 B 指令中发生了模式切换,肯定是会出问题的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二手的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值