arm函数内部进行模式切换的技巧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm函数内部进行模式切换的技巧相关的知识,希望对你有一定的参考价值。

这是某个函数的入口,可以看出cpu运行在thumb模式

技术分享

运行到<+4>,跳转到分支 0xf6bda400,不改变仍运行在thumb模式,但是调试器却没有正确理解,以arm模式给出了反汇编

技术分享

幸好这只是调试器反汇编出来的,要是CPU运行在错误的模式进行指令译码,然后执行,大家都知道CPU执行上面译码出来的指令,要么就SIGILL要么就SIGSEGV。那么我们通过指定arch译出正确的指令

技术分享

技术分享

这时可以看到,虽然当前指令被正确译码,但是到技术分享却是错误的指令。这里就出现了同一函数内模式切换的技巧。

注意三点,

1.从上一条指令 技术分享跳进来,

2.pc下一条指令与当前指令地址一样,技术分享,x86汇编也有类似的技巧。

3. 当前执行指令技术分享

合起来就是

技术分享

技术分享

技术分享

当前pc是偶对齐的,bx pc意味CPU跳转到pc指令同时也切换到了arm模式。这样一来,pc取指令的步进就是按arm模式进行,也就是pc+=4。那么就是到 0xf6bda404,这时就是按arm模式进行译码了。

技术分享

技术分享

技术分享

God!! 又来了,0xf6bda40c 开始又反汇编错误了,这里又一技巧。当执行pc指令,即 ldr r12, [pc] 时,pc同时pc+=4,那么load进r12的就是 0xf6bda40c 的0xffffe4b4。(ps,上面pc的值有点误)

技术分享

技术分享

这时可能就是跳到某个内联的static函数了。

 

以上是关于arm函数内部进行模式切换的技巧的主要内容,如果未能解决你的问题,请参考以下文章

ARM 寄存器及异常处理

ARM(ARM内部寄存器及SFR异常处理中断向量表)

将 SSE2 迁移到 Arm NEON 内部函数

为啥在模式内部切换在 laravel 中不起作用?

学习总结之ARM处理器的运行模式及ARM寄存器

2016.4.6 我从内部看ARM课程笔记