缘由

今天在分析ARM伪指令ADR,书上说ADR通常会被一条ADD或SUB指令替代实现相同功能。我反汇编了一下确实如此会基于PC相对偏移的地址量读取到寄存器中,可是计算却发现对不上

如上图所示,ADR R2,BOB被指令SUB R2,PC,#0x0C替换。

计算

可是由图可知PC值应该为8,执行完这条语句后指向下一条指令的地址12。可是8-12=-4,得不到结果4。如果要得到4的结果,则PC值应该为16,比理论值大8.

为什么读取PC值时,比预想的大8

查阅手册http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Cihcdbca.html

相关资料https://stackoverflow.com/questions/24091566/why-does-the-arm-pc-register-point-to-the-instruction-after-the-next-one-to-be-e

ARM(ARM7) 采用三级流水线结构,取指、译码、执行,PC始终指向你要取的指令的地址,而不是执行完一条指令后指向下一条指令的地址

当第一条指令进入执行阶段的时候,第三条指令进入取指阶段,所以PC+8.
在执行第一条指令时,我本以为PC的值为0,在执行完第一条指令后PC+4=4指向第二条指令的地址,可是让我意向不到是第一条指令在执行阶段,第三条指令在取指阶段,PC执向取指令的指令地址,所以PC为8。

ARM9采用五级流水结构,但PC也是加8,为什么?

ARM9虽然是五级流水线,但是它的第一条指令的执行阶段也是对应着第三条指令的取指阶段,所以为PC+8,更多请看参考

为什么我的调试器上显示的PC值没有加8

请看下图的运行,PC显示的值为下一条要执行的指令的地址,并没有加8为什么?

It's easier to have the assembler/linker compensate for that 2-instruction offset than to design all the logic to 'correct' the PC register.也就是说汇编器把R15(PC)这个显示值进行了补偿,使“PC指向下一条要执行的指令的地址”这个逻辑看起来合理。

对此你有何感言?

disgusting ! nasty!

最新文章

  1. Nodejs 创建web服务
  2. Jmeter之Web端HTTP性能测试(九)
  3. mybatis.xml文件中#与$符号的区别以及数学符号的处理
  4. wkhtmltopdf乱码解决方案
  5. js的隐含参数(arguments,callee,caller)使用方法
  6. PHP使用SnowFlake算法生成唯一ID
  7. kakfa源码编译打包
  8. [转] linux下的僵尸进程处理SIGCHLD信号
  9. NBA工资帽
  10. (iOS)推送常见问题
  11. 排序算法门外汉理解-Shell排序
  12. 微信小程序数据请求方法wx.request小测试
  13. TP框架 增删查
  14. 微信小程序 支付功能(前端)的实现
  15. linux软件包介绍
  16. RobotFramework自动化测试框架-移动手机自动化测试Open Application关键字的使用
  17. 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
  18. python接口自动化(十四)--session关联接口(详解)
  19. oldboy s21day14装饰器模块和面试题
  20. 原生js学习 选择dom

热门文章

  1. Vim 文本编辑器的基本使用
  2. JAVA中异常状况总结
  3. SQL 语法速记
  4. TensorFire:WEB端的高性能神经网络框架
  5. Numpy 矩阵
  6. [转载]C# 常用日期时间函数(老用不熟)
  7. node.js学习(一)
  8. apache编译安装php后需要注意以下配置
  9. P1383 高级打字机
  10. mariadb的flashback到底怎么样???防误删可以,但算不上真正的闪回--再看mariadb 10.3的System-Versioned Tables