码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-10 12:54:39      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:函数   模式   汇编   arm   就是   9.png   技术分享   bsp   指定   

这是某个函数的入口,可以看出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   就是   9.png   技术分享   bsp   指定   

原文地址:http://www.cnblogs.com/bbqzsl/p/7813894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!