繁体   English   中英

为什么ARM的此分支指令不起作用

[英]Why this branch instruction of ARM doesn't work

现在,我正在编写一个库来模拟C / C ++的琐碎函数。 它的用法如下: MOCK(mocked, substitute)如果调用MOCK(mocked, substitute)函数,则会替代调用替代函数。

我修改了代码页的属性,并将跳转代码注入到函数中以实现它。 我已经为x86 CPU实现了它,我想将其移植到ARM CPU 但是当我注入二进制代码时,我遇到了一个问题。

例如,替代函数的地址为0x91f1 ,要模拟的函数的地址为0x91d1 因此,我想将ARM分支代码注入0x91d1以跳转到替代函数。

根据在线文件,相对地址为

(0x91f1 - (0x91d1 + 8)) / 4 = 6

所以二进制指令是:

0xea000006

因为我的arm模拟器(我使用Android arm v7模拟器)是低端字节序的,所以要注入的二进制代码是:

0x060000ea

但是当我在注入分支代码后执行了模拟功能时,发生了段错误。 我不知道分支指令为什么出错。 我还没有学习过ARM体系结构,所以我不知道ARM的分支指令是否有一些限制。

分支到的地址为奇数,表示它们处于Thumb模式。

您的方法存在明显的问题。

如果目标是在Thumb模式下,则您需要从分支处进入Thumb模式,或者需要使用bx (分支和交换)指令。

您的函数处于Thumb模式(目标为+1),但是您使用的是ARM模式分支编码(BA 1编码?),因此很明显,您未处于Thumb模式或正在Thumb模式中使用ARM模式指令。

ARM系列允许使用值加载寄存器。 这些寄存器之一是PC(程序计数器)。

一些替代方案:

  1. 您可以使用函数将目标地址(绝对值)加载到PC寄存器中。
  2. 将PC寄存器加一个偏移量。
  3. 在PC寄存器中使用乘加指令。
  4. 将目标寄存器压入堆栈,然后弹出PC寄存器。

这些选择加上修改分支指令的目标都是“最佳”的所有不同选项。 选择最适合您并且最容易维护的一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM