標籤:分享 ima 計算 blog inf 文章 過程 detail call
文章部分圖片文字來自參考文章,參考文章總結地很好。
指令處理階段
為了降低實現的複雜性,採用統一的架構,這樣可以共用一些組件.我們將Y86的指令處理組織成如下幾個階段:
- 取指(Fetch):從指令寄存器讀取指令.
- 解碼(Decode):讀取程式寄存器.
- 執行(Execute): ALU計算結果(分為兩種一種是計算值(用於更新程式寄存器),一種是計算儲存空間引用的有效地址).
- 訪存(Memory):讀寫儲存空間.
- 寫回(Write Back):寫回寄存器檔案.
- 更新PC(PC update):將PC設定成下一條指令的地址.
先大家只需要瞭解一下一條指令執行的要經曆的階段,後面會分析Y86的具體指令的執行過程.
需要注意的兩點:
1.在統一架構下,每條指令都會經曆以上所有階段.
2.在SEQ/SEQ+裡,各個階段是順序進行的,但一個階段內的內容基本上(有例外,稍後再說)是並存執行的.
Y86
指令的執行
下面是各種指令處理的各個階段,大家可以一掃而過,看我的分析結果,再對照著圖就很容易理解.
看到上面的指令處理的各個階段是不是天花亂墜啊.其實一點不複雜,因為使用的是統一的架構.總結起來就如下幾點:
(1).首先要看指令到底要幹啥,它的運算元是啥,明確資料流的方向.
比如opl, rrmovl, irmovl, cmovXX都不涉及到儲存空間,都是將Execute階段中的執行結果valE給某個程式寄存器.(資料流方向: valE->程式寄存器).
比如mrmovl, popl的資料流方向是:儲存空間->程式寄存器.以為這肯定要從儲存空間中取出valM,再給這個程式寄存器.
比如rmmovl的資料流方向是:程式寄存器->儲存空間,肯定會寫入儲存空間.
(2).寫入程式寄存器的資料有兩種來源,一種是valE(opl,rrmovl, irmovl, pushl, popl, call, ret,cmovXX),一種是valM(mrmovl, popl).
(3). pushl, popl, call, ret都涉及了"棧"(儲存空間),都會更新%esp(%esp+/-4:在執行階段計算出來valE).將valE寫回%esp.
(4). opl在執行階段會設定CC, cmovXX, jXX在執行階段會有一個判斷邏輯.
(5).只有rmmovl, pushl和call需要寫回儲存空間.
(6).統一處理的原則:在excute階段,valA盡量不參與運算,使用valB參與運算;在memory階段,都是valA參與運算(為了使得pushl和rmmovl統一處理).
(7).
疑點
————
1. rrmovl的execute階段本不需要運算,為什麼要執行"valE = 0+valA"?
答:使用的是統一的架構,每條指令都必須通過每個階段.這樣做還有一個好處,減少訊號傳遞的數量.寫回都是通過valE和valM的,而不需要valA.
2.為什麼是mrmovl D(rB), rA而不是 mrmovl D(rA), rB?
答:統一處理 mrmvol和rmmovl.這樣保證了"execute階段, valA盡量不參與運算,使用valB參與運算".
3. popl rA的Write back階段需要寫兩個寄存器.這兩個寫應該是有次序的啊?
答:是的.為了保證"popl%esp"的語義同IA32一致,"R[%esp]<-valE"必須在"R[rA]<-valM"之前,這意味著按照只能在上升沿update的規則,就需要2個cycles來執行(違反了原則)。
4. pushl rA怎麼沒有問題?
答:由於在SEQ CPU中.因為讀取的值在某根訊號線(指的是valA訊號)上存在著.即便是"pushl %esp", %esp的值已經在valA訊號線上了,只需要將valA的值寫回儲存空間即可.
參考文章:
1.8280141
電腦作業系統(二)--- 處理器體繫結構(三)(轉)