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!

猜你喜欢

转载自www.cnblogs.com/uestcman/p/9757758.html