ARM MOV PC加8
缘由
今天在分析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

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!
ARM MOV PC加8的更多相关文章
- 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- arm mov 指令
语法格式: mov {条件} 1目的寄存器,2源操作数 作用: MOV指令可完成从另一个寄存器.被移位的寄存器或立即数赋值到目的寄存器.其中S选项为指令的操作结果是否操作CPSR中的条件标志位,当没有 ...
- 从MOV PC,PC;(或者ADDPC,PC,#4 )看ARM的三级流水线过程
3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行. ⑴ 取指从存储器装载一条指令 ⑵ 译码识别将要被执行的指令 ⑶ 执行处理指令并将结果写会寄存器 以前学过的51单 ...
- ARM获得PC指针为何PC=PC+8
http://blog.csdn.net/sddzycnqjn/article/details/7691534 R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指 ...
- 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据
感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...
- gm8180:arm linux启动加载模块、运行程序
1. init #!/bin/busybox ash#load modules mao 2013-02-16 14:12:48 echo "************************m ...
- linux从head.s到start_kernelstart_kernel之---内核重定位后分析
参考: https://biscuitos.github.io/blog/ARM-BOOT/ zImage 重定位之后实践 zImage 重定位之后,ARM 将 pc 指针指向了重定位 zImage ...
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- ARM 内核SP,LR,PC寄存器
深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模 ...
随机推荐
- python pandas简单使用处理csv文件
这里jira.csv是个大文件 1) >>> import pandas >>> jir=pandas.read_csv(r'C:\Temp\jira.csv') ...
- php获取字符串长度函数strlen和mb_strlen
php获取字符串长度函数strlen和mb_strlencount() - 计算数组中的单元数目,或对象中的属性个数strlen — 获取字符串长度,一个汉字为3个字符mb_strlen() - 获取 ...
- ELKF安装使用教程。elasticsearch+logstash+kibana+filebeta。
近期因工作需要学习了ELKF的安装和使用.网络上的中文我看大部分也比较老版本了,我想写一下,希望能给他人带来一点帮助.小弟不才,有错位之处,还请大家原谅指点. ELKF就是:elasticsearch ...
- linux screen 多任务后台执行
1.安装工具:yum install -y screen 2.进入新screen界面:screen 3.回到原命令行:先按CTRL+a,然后再按d 4.查看现有的screen回话:screen -ls ...
- Porsche Piwis II V14. three hundred and fifty computer software Tester II
Porsche piwis tester 2 Help Devices: SERP automatio tranny, air-conditioner, SRS, ABDOMINAL MUSCLES, ...
- IP代理
import requests # 定义爬取url地址 base_url = 'https://www.baidu.com/' # 定义代理IP地址 proxies = {'http':'http:/ ...
- mysql 汇总
子查询: select a.id,a.hotelname,max(b.day) as day,a.hotelrankid, c.hotelrank,min(b.basicprice) a ...
- wait与sleep的区别
1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还 ...
- Ubuntu 部署 nginx
Ubuntu 部署 nginx apt-get install nginx
- PID算法控制简单理解
1 传统的位式控制算法 用户期望值Sv(设定值)经控制算法输出一个输出信号OUT,输出信号加载到执行部件上(像MOS管等)对控制对象进行控制(步进电机.加热器等),控制对象的当前值(Pv)如速度通过传 ...