ARM MOV PC加8

Posted uestcman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

相关资料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的主要内容,如果未能解决你的问题,请参考以下文章

关于ARM PC值

arm指令中mov和ldr有啥区别?

arm-linux-gcc 交叉编译问题,代码是照着书抄的,版本arm-linux-gcc4.4.3,PC ubuntu11.10

arm汇编 ldr r0 =0x00000000 这个=号代表啥啊

ARM汇编中的LDR/STR

qt-4.8.4安装和环境变量配置