// 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;