新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編編程基礎之二-流水線對PC值的影響

        ARM匯編編程基礎之二-流水線對PC值的影響

        作者: 時間:2016-11-27 來源:網絡 收藏

        CPU模型圖,源自http://teach.jwc.bupt.cn:4213/jsjzcyl/resource/cai/素材庫/fig/Flash/5.1.swf

        本文引用地址:http://www.104case.com/article/201611/322184.htm

        從上圖中我們看到CPU內部有3個主要組成部分:指令寄存器,指令譯碼器,指令執行單元(包括ALU和通用寄存器組)。

        CPU在執行1條指令的時候,主要有3個步驟:取指(將指令從內存或指令cache中取入指令寄存器);譯碼(指令譯碼器對指令寄存器中的指令進行譯碼操作,從而辨識出該指令是要執行add,或是sub,或是其它操作,從而產生各種時序控制信號);執行(指令執行單元根據譯碼的結果進行運算并保存結果)

        現在我們假設一下:CPU串行執行程序(即:執行完1條指令后,再執行下一條指令);指令執行的3個步驟中每個步驟都耗時1秒;整個程序共10條指令。那么,這個程序總的執行時間是多少呢?顯然,是30秒。但這個結果令我們非常不滿意,因為它太慢了。有沒有辦法讓它座上京津高鐵提速3倍呢?當然有!仔細觀察上圖,我們發現:取指階段占用的CPU硬件是指令通路和指令寄存器;譯碼階段占用的CPU硬件是指令譯碼器;執行階段占用的CPU硬件是指令執行單元和數據通路。三者占用的CPU硬件完全不同,這樣就使得如下的操作得以進行:在對第1條指令進行譯碼的時候,可以同時對第2條指令進行取指操作;在對第1條指令進行執行的時候,可以同時對第2條指令進行譯碼操作,對第3條指令進行取指操作。顯然,這樣就可以將該程序的運行總時間從30秒縮減為12秒,提速近3倍。上面所述并行運行指令的方式就被稱為流水線操作。可見:流水線操作的本質是利用指令運行的不同階段使用的CPU硬件互不相同,并發的運行多條指令,從而提高時間效率。

        流水線的引入,的確提高了CPU運行指令的時間效率,但卻為我們的匯編程序編寫引入了新的問題。請看下面的分析:

        寄存器PC的值是即將被取指的指令的地址,正常情況下,在該條指令被取入CPU后執行期間,PC的值保持不變,在該條指令執行完成的時間點上,硬件會自動將PC的值增加一個單位的大小,這樣PC就指向了下一條將被取指和執行的指令。而在引入流水線后,PC值的情況發生了變化,假定第1條指令的內存地址為X,則在時刻T,PC的值變為X,并在時刻T至時刻T+1期間維持不變;在時刻T+1,PC的值變為X+1個單位,并在時刻T+1至時刻T+2期間維持不變;在時刻T+2,PC的值變為X+2個單位,并在時刻T+2至時刻T+3期間維持不變;在時刻T+3,PC的值將變為X+3個單位。由此可見,在第1條指令的執行階段,PC的值不再是該指令在內存中的位置,而是該指令在內存中的位置+2個單元。對于ARM指令集而言,每條指令的長度為32bit,占4byte,所以1條指令在內存中需要4byte存儲。因此,我們的結論是:

        指令執行時,PC的值 = 當前正在執行指令在內存中的地址 + 8

        請牢記以上結論。雖然目前我們并不明白這個結論有何作用,但在后續的課程中,特別是通過查看反匯編代碼的方式理解偽指令和編譯器行為的時候,這個結論將會很有幫助。

        最后說明一點:其實ARM現在的CPU的流水線級數早已經突破了3級。但我仍然以3級流水線來進行講解,是因為:1、較之多級流水線,3級流水線最簡單,因此也最便于初學者理解;2、雖然存在多種級別的流水線,但ARM出于統一和前后兼容的考慮,PC的值 = 當前正在執行指令在內存中的地址 + 8這個結論在所有的流水線級別上都是相同的。作為編程人員而言,我們只需要知道這個結論即可。

        致謝:感謝安博中程的Michael Tang為本文制作了示意圖。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 逊克县| 封丘县| 乌拉特前旗| 常宁市| 姚安县| 郧西县| 瑞昌市| 右玉县| 思南县| 苏州市| 定西市| 卢氏县| 潢川县| 新田县| 五指山市| 陕西省| 黔西| 根河市| 闸北区| 铁力市| 九台市| 朝阳县| 平山县| 碌曲县| 夹江县| 济南市| 上栗县| 离岛区| 天全县| 本溪市| 金昌市| 淮安市| 桐梓县| 阿拉善盟| 渭源县| 巴彦县| 屏山县| 化德县| 龙海市| 上思县| 格尔木市|