再次解釋ARM 流水線 比如add r0 pc g oalAddressTable
// topic:再次解釋ARM 流水線 比如add r0, pc, #g_oalAddressTable - (. + 8)的問題
// 作者:gooogleman
關於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的官文吧
實在不行就再看看這段話的含義!
R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定將“正在執行的指令作為參考點”,稱之為當前第一條指令,因此PC總是指向第三條指令。當ARM狀態時,每條指令為4位元組長,所以PC始終指向該指令地址加8位元組的地址,即:PC值=當前程式執行位置+8;