ARM 汇编:奇怪的指令模式(无限循环?)

逆向工程 拆卸 部件 手臂
2021-06-18 16:38:17

我注意到一个奇怪的指令模式。首先将 PC 的值移入 LR,然后将寄存器值移入 PC。

这里有一些例子:

.text:00001488                 MOV             LR, PC
.text:0000148C                 MOV             PC, R2
 ...
.text:000304E8                 MOVNE           LR, PC
.text:000304EC                 MOVNE           PC, R3

如果这个模式对应于一个调用指令,这会不会导致无限循环?如果这不对应于呼叫,这是什么?

2个回答

这实际上是在引入BLX指令(ARMv5 IIRC)之前在 ARM 中执行间接调用的正确方法ARM(32 位版本)的特殊之处在于,当您读取它时,PC 的值指向前面的两条指令(因此在 ARM 模式下为 +8,在 Thumb 模式下为 +4)。所以,以你的为例:

.text:00001488                 MOV             LR, PC

在这里,PC值将是 1488+8 = 1490,所以LR=0x1490

.text:0000148C                 MOV             PC, R2

在这里,PC将被设置为值,R2处理器将开始从该地址获取指令。最有可能的是一个以返回指令结尾的函数 - MOV PC, LR(IDA 显示为RET),因此执行将在LR(0x1490)的值处恢复,恰好在原始MOV PC, R2指令(0148C+4=0x1490)之后,所以实际上指令序列等同BLX R2于较新的处理器。

我不太确定它是否是调用模式,但是由于管道的原因,此代码可以,并且不会创建无限循环。随着人们引用这里这里

在手册(ARM 体系结构参考手册 ARMv7-A 和 ARMv7-R 版)的第 A2-11 页(第 A2.3 节)上,有人说:

PC,程序计数器

  • 执行 ARM 指令时,PC 读取为当前指令地址加 8。
  • 执行 Thumb 指令时,PC 读取为当前指令地址加 4。
  • 将地址写入 PC 会导致跳转到该地址。

大多数 Thumb 指令无法访问 PC。ARM 指令集提供了对 PC 的更通用访问,许多 ARM 指令可以将 PC 用作通用寄存器。但是,ARM 不赞成将 PC 用于程序计数器以外的任何目的。有关详细信息,请参阅第 A2-46 页的写入 PC。软件可以将PC称为R15