再次解释ARM 流水线 比如add r0, pc, #g_oalAddressTable - (. + 8)的问题

时间:2021-06-11 17:30:03

       // topic:再次解释ARM 流水线 比如add    r0, pc,  #g_oalAddressTable - (. + 8)的问题

       // 作者:gooogleman

       // 邮箱:gooogleman@foxmail.com

       //网址:http://blog.csdn.net/gooogleman/article/details/7651548 

          关于add    r0, pc,  #g_oalAddressTable - (. + 8)这条指令,很多人曾经在CSDN论坛问过,我以前也回答过很多,现在居然在我的开发板技术支持群,还有人问起,并且貌似怎么说他也不明白。

         其实他是陷入死胡同,非要用自己的思维去想。

         其实这是ARM 约定的东西,ARM 用这种流水线的方式去做是非常科学的,就像我们现实中的工厂流水线方式,能够提高效率。

好了,这里不管是ARM7/ARM9/ARM11 也好,甚至是S5pv210 都是符合标题的写法的。原因如下:

R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;

 

在S3C6410 OK6410 real6410 eboot中有

 

add          r11, pc, #g_oalAddressTable -(. + 8)

在在我做的Sate210 的winceeboot中也有:

add r11, pc, #g_oalAddressTable -(. + 8)

还不明白吗

那就去看看ARM的官文吧

完整的介绍请参考文档:http://www.arm.com/pdfs/comparison-arm7-arm9-v1.pdf

 

实在不行就再看看这段话的含义!

R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;