1. 程式人生 > >再次解釋ARM 流水線 比如add r0 pc g oalAddressTable

再次解釋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;