標籤:
第四章 處理器體繫結構
(一)知識點總結
一、Y86指令集體繫結構
1.Y86處理器狀態類似於IA32,有8個程式寄存器:
%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。處理器的每個程式寄存器儲存一個字。%esp被入棧、出棧、調用和返回指令作為棧指標。
2.3個一位的條件嗎:ZF、SF、OF,它們儲存最近的算術或邏輯指令所造成影響的有關資訊。程式計數器PC存放當前正在執行指令的地址。
3.程式狀態的最後一個部分是狀態代碼stat,它表明程式執行的總體狀態
4.Y86指令集如下(所有數值都用十六進位表明)
5.IA32的movl指令:irmovl、rrmovl、mrmovl、rmmovl。指令名字第一個字母代表源的類型。源可以是立即數(i)、寄存器(r)、儲存空間(m),目的可以是寄存器(r)、儲存空間(m)
6.兩個儲存空間傳送指令中的儲存空間引用方式是基址和位移量形式
①4個整數操作指令:addl、subl、andl、xorl
②7個跳轉指令:jmp、jle、jl、je、jne、jge、jg
③6個條件傳送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg
④Halt指令停止指令的執行
7.指令編碼
①每條指令需要1—6個位元組不等。每條指令的第一個位元組表示指令的類型,這個位元組分為兩個部分,每部分4位:高4位是代碼部分,低4位是功能部分
②rrmovl與條件傳送有同樣的指令代碼,可以看做“無條件傳送”,jmp是“無條件跳轉”,它們的功能代碼都是0.
③8個寄存器對應的0-7寄存器標識符
④可能有附加的寄存器指示符位元組,指定一個或兩個寄存器,這些寄存器欄位為rA、rB。
⑤有些指令要一個附加的4位元組常數字,能作為irmovl的立即數資料,rmmovl和mrmovl的地址指示符的位移量,以及分支指令和調用指令的目的地址(是絕對位址)。所有整數採用小端法編碼,當指令按照反組譯碼格式書寫時,這些位元組以相反順序出現。
8.Y86異常
以“.”開頭的詞是彙編器命令,它們告訴彙編器調整地址,以便在那裡產生代碼或插入一些資料
9.資訊= 位+上下文。 第4章,位(串)就是Y86機器碼,上下文就是圖4-2,資訊就是Y86指令集。
二、邏輯設計和硬體控制語言HCL
1.邏輯門:&&、|| 、!
2.組合電路:很多邏輯門組合成一個網,構建計算塊。構建這些網有兩條限制
①兩個或多個邏輯門的輸出不能串連在一起,否則可能會使線上的訊號矛盾,導致一個不合法的電壓或電路故障
②網必須無環
3.字級的組合電路和HCL整數運算式
一些位級訊號代表一個整數或一些控制模式。執行字級計算的組合電路根據輸入字的各個位,用邏輯門來計算輸出字的各個位。
4.多工器:根據輸入控制訊號的值,從一組不同的資料訊號則選出一個。多工函數是用情況運算式描述的。
5.算數/邏輯單元是很重要的組合電路,有三個輸入,標號為A、B的兩個資料輸入和一個控制輸入。根據控制輸入的設定,電路會對資料輸入執行不同的算數或邏輯操作。
6.判斷集合關係的通用格式
Iexpr in {iexpr1,iexpr2,…,iexprk}
7.兩類儲存空間裝置
①時鐘寄存器(簡稱寄存器)儲存單個位或字,時鐘訊號控制寄存器載入輸入值
②隨機訪問儲存空間(簡稱儲存空間)儲存多個字,用地址來選擇該讀或該寫哪個字
8.Y86處理器會用時鐘寄存器保持程式計數器(PC)、條件代碼(CC)、程式狀態(Stat)
9.寄存器檔案有兩個讀連接埠(A、B)還有一個寫連接埠(W),多連接埠隨機訪問儲存空間允許同時進行多個讀和寫操作。
三、Y86的順序實現
1.將處理組織成階段
①取指:取指階段從儲存空間讀取指令位元組,地址為程式計數器PC的值
②解碼:解碼階段從寄存器檔案讀入最多兩個運算元
③執行:在執行階段,算數/邏輯單元要麼根據ifun的值執行指令指明的操作,電腦儲存空間引用的有效地址,要麼增加或減少棧指標
④訪存:訪存階段可以將資料寫入儲存空間,或從儲存空間讀出資料
⑤寫回:寫回階段最多可以寫兩個結果到寄存器檔案
⑥更新PC:將PC設定成下一條指令的地址
2.執行rrmovl指令和執行算術運算類似,不過不需要取第二個寄存器運算元。將ALU的第二個輸入設為0,先把它和第一個運算元相加,得到valE=valA,然後再把這個值寫到寄存器檔案。
3.對irmovl的處理與上類似,除了ALU的第一個輸入為常數值valC。因為是長指令格式,對於irmovl,程式計數器必須加6。所有這些指令都不改變條件碼
4.pushl指令開始時很像前面講過的指令,但在解碼階段,用%esp作為第二個寄存器運算元的標識符,將棧指標賦值為valB。在執行階段用ALU將棧指標減4,減過4的值就是儲存空間寫的地址,在寫回階段還會存到%esp中。
5.popl指令的執行與pushl的執行類似,除了在解碼階段要讀兩次棧指標以外。popl應該首先讀儲存空間,然後再增加棧指標。
6.call指令、ret指令和pushl、pop類似。指令call:將call指令後面跟著的那條指令的地址valP壓入棧中,在更新PC階段將PC設為調用目的地valC。指令ret:在更新PC階段,將從棧中取出的值valM賦值給PC。
7.SEQ的實現包括組合邏輯和兩種儲存空間裝置:時鐘寄存器、隨機訪問儲存空間。
8.需要對時序進行明確控制的四個硬體單元——程式計數器、條件碼寄存器、資料存放區器、寄存器檔案。
9.計算原則:處理器從不需要為了完成一條指令的執行而去讀由該指令更新了的狀態。在時鐘上升開始下一個周期時,處理器就可以同時執行寄存器寫和儲存空間寫。
有些指令(整數運算)會設定條件碼,有些指令(跳轉指令)會讀取條件碼,但沒有指令必須既設定又讀取條件碼。雖然到時鐘上升開始下一個周期時才會設定條件碼,但是在任何指令試圖讀之前,它們都會更新。
10.常用常數
11.SEQ階段的實現
①取指階段
取指階段包括指令儲存空間硬體單元。以PC作為第一個位元組(位元組0)的地址,這個單元一次從儲存空間讀出6個位元組,第一個位元組被解釋稱指令位元組,分為兩個4位元。標號為“icode”和“ifun”的控制邏輯塊計算指令和功能碼等於從儲存空間讀出值,或者當指令地址不合法時(imem_error指明),這些值對應於nop指令
②解碼和寫回階段
都要訪問寄存器檔案。寄存器檔案有四個連接埠,支援同時進行兩個讀(連接埠A、B)和兩個寫(E、M),每個連接埠都有一個地址串連和一個資料連線。根據指令代碼icode以及寄存器指示值rA和rB,可能還會根據執行階段計算出的Cnd條件訊號。
③執行階段
執行階段包括算術/邏輯單元(ALU)第一步每條指令的ALU計算,執行階段還包括條件碼寄存器
④訪存階段
訪存階段的任務是讀或者寫程式資料,兩個控制塊產生儲存空間地址和儲存空間輸入資料的值,另外兩個塊產生控制訊號表明應該執行讀操作還是寫操作。當執行讀操作時資料存放區器產生值valM
⑤更新PC階段
SEQ中最後一個階段會產生程式計數器的新值,依據指令的類型和是否要選擇分支,新的PC可能是valC、valM、valP
(二)實驗過程
構建YIS環境:
YIS測試:
cd y86-code進入測試代碼,教材p239頁代碼為asuml.ys,可以通過make asuml.yo進行彙編,asuml.yo就是彙編後的結果
make all可以彙編運行所有代碼結果:
(三)參考資料
1.《深入理解電腦系統》
2.《嵌入式Linux應用程式開發標準教程》
3.《Y86 Tools》
(四)學習感想及總結
本章主要學習了Y86指令集體繫結構、邏輯設計和硬體控制語言HCL、Y86的順序實現,根據教材上的詳細圖示我瞭解了Y86組譯工具與I32組譯工具的不同,掌握了Y86指令OP1、rrmovl、irmovl、rmmovl、mrmovl、pushl、popl等指令在順序實現中的計算。在構建YIS環境的實驗中,我一開始也遇到了不能解析命令地址這個問題。在老師把外網地址修改成內網地址之後就成功地串連到了主機,不過實驗最後顯示make:***[all]錯誤,我不知道這個什麼錯誤以及錯誤原因,望老師指正。
《深入理解電腦系統》第六周學習筆記