缘由

今天在分析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!

ARM MOV PC加8的更多相关文章

  1. 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.                                                 ...

  2. arm mov 指令

    语法格式: mov {条件} 1目的寄存器,2源操作数 作用: MOV指令可完成从另一个寄存器.被移位的寄存器或立即数赋值到目的寄存器.其中S选项为指令的操作结果是否操作CPSR中的条件标志位,当没有 ...

  3. 从MOV PC,PC;(或者ADDPC,PC,#4 )看ARM的三级流水线过程

    3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行. ⑴ 取指从存储器装载一条指令 ⑵ 译码识别将要被执行的指令 ⑶ 执行处理指令并将结果写会寄存器 以前学过的51单 ...

  4. ARM获得PC指针为何PC=PC+8

    http://blog.csdn.net/sddzycnqjn/article/details/7691534 R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指 ...

  5. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

  6. gm8180:arm linux启动加载模块、运行程序

    1. init #!/bin/busybox ash#load modules mao 2013-02-16 14:12:48 echo "************************m ...

  7. linux从head.s到start_kernelstart_kernel之---内核重定位后分析

    参考: https://biscuitos.github.io/blog/ARM-BOOT/ zImage 重定位之后实践 zImage 重定位之后,ARM 将 pc 指针指向了重定位 zImage ...

  8. Tiny4412 Linux 内核启动流程

    Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...

  9. ARM 内核SP,LR,PC寄存器

    深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模 ...

随机推荐

  1. git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法

    git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法提交代码流程:1.先提交代码到自己分支上2.切换到devlop拉取代码合并到当前分支3.合并后有变动的推送到自己 ...

  2. 随笔 js-----------------------------------------------------------------------------------------------------

    http://www.cnblogs.com/liuling/p/2014-4-19-04.html   redis Base64.encode($( "#byerName").v ...

  3. script 跳出小窗口

    sss  

  4. ssh-keygen 命令

    功能 生成.管理和转换认证密钥,包括 RSA 和 DSA 两种密钥,密钥类型可以用 -t 选项指定.如果没有指定则默认生成用于SSH-2的RSA密钥,系统管理员还可以用它产生主机密钥. 通常,这个程序 ...

  5. mycat下mysql jdbc connector使用高版本报PacketTooBigException异常

    如下所示: 5.1.30切换为mysql-connector 5.1.46/40,报错,可参考https://blog.csdn.net/n447194252/article/details/7530 ...

  6. mysql不常用但很有用的语句整理

    mysqld_multi多实例停止.启动 mysqld_multi --defaults-file=/etc/my.cnf start 1,2 mysqld_multi --defaults-file ...

  7. Python学习基础(二)——集合 深浅拷贝 函数

    集合 # 集合 ''' 集合是无序不重复的 ''' # 创建列表 l = list((1, 1, 1)) l1 = [1, 1, 1] print(l) print(l1) print("* ...

  8. H5浏览器播放RTMP直播流实现切换

    切换直播源的参考:http://blog.csdn.net/u012737182/article/details/73920830

  9. bzoj 2527 Meteors - 整体二分 - 树状数组

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  10. topcoder srm 540 div1

    problem1 link 设第一个数字为$x$,那么第2到第$n$个数字都可以表示成$a+bx$的形式,其中$b=1$或者$b=-1$.然后可以求出关于$x$的一些范围,求交集即可. problem ...