zoukankan      html  css  js  c++  java
  • android so调试时遇到的坑

    直接看下面这段ARM汇编:

    clip_image001_thumb

    此时运行到的代码为ADD R3,PC

    此时看一下寄存器窗口的值:

    clip_image002_thumb

    按理来说执行完ADD R3,PC后的效果应该是R3=R3+PC ,R3=40A1D5C8

    但是我们可以执行以下看看实际的值是什么

    clip_image003_thumb[1]

    我擦。。。居然和我们算的不一样。。。R3的值变成了40A1D5CC,比我们计算的值多了4这是为什么呢?

    这里引入一些ARM的流水线机制

    ARM7的三级流水线示意图:

    clip_image004_thumb[1]

    ARM9的五级流水线示意图:

    clip_image005_thumb[1]

    很明显的可以看出,不管是三级流水线还是五级流水线,每条ARM指令都有一个取指,解码,执行的过程。

    第一条指令处于执行的周期时,第三条指令已经开始了取指的操作,这就导致了我们之前看到的情况。IDA中PC指向的那条指令已经处于执行阶段,真实的PC的值应该是指向处于取值阶段的下下条指令,而这条指令的地址比当前执行的指令地址大4,所以实际结果比我们计算的结果大了4

    注:本博客文章转载需带上原文链接
  • 相关阅读:
    分治
    #include<algorithm>
    c++标准模板库的使用
    mysql_day03
    mysql_day02
    mysql_day01
    mongodb的安装
    迭代器和生成器简单介绍
    File文件操作
    数据类型
  • 原文地址:https://www.cnblogs.com/dliv3/p/5285771.html
Copyright © 2011-2022 走看看