實驗五 第四章 處理器體系結構
本章重點是4.1-4.3
重點習題:4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24
本章重點内容是:處理器結構,各種邏輯門,功能單元,指令集,指令的執行,指令執行的流水線
首先要定義一個簡單的指令集,作為我們處理器實作的運作示例。受到IA32指令集的啟發,他被俗稱為x86,即Y86指令集。與IA32相比,Y86指令集的資料類型,指令和尋址方式都要少一些
Y86程式中的每條指令都會讀取或修改處理器狀态的某些部分,稱為程式員可見狀态
Y86的處理器狀态類似于IA32。有八個程式寄存器:%eax %ebx %ecx %edx %esi %edi %esp %ebp。處理器的每個程式寄存器存儲一個字。寄存器%esp被入棧,出棧,調用和傳回指令作為棧指針。在其他情況中,寄存器沒有固定的含義或固定值。有三個一位的條件碼:ZF SF OF,他們儲存最近的算術或邏輯指令所造成影響的有關資訊。程式計數器(PC)存放目前正在執行指令的位址
存儲器:從概念上來說就是一個很大的位元組數組,保留着程式和資料。Y86程式用虛拟位址來引用存儲器位置。硬體和作業系統軟體聯合起來将虛拟位址翻譯成實際或實體位址,指明資料實際儲存在存儲器中哪個地方
關于Y86:
1.IA32的movl指令分成了4個不同的指令:irmovl,rrmovl,mrmovl,rmmovl,分别顯式的指名源和目的的格式。源可以是立即數(i)寄存器(r)或存儲器(m)。指令名字的第一個字母就表明了源的類型。目的可以是寄存器(r)或存儲器(m)。指令名字的第二個字母指明了目的類型
2.有4個整數操作指令addl,subl,andl,xorl
3.7個跳轉指令jmp,jle,jl,je,jne,jge,jg
4.6個條件傳送指令cmovle,cmovl,cmove,cmovne,cmovge,cmovg
5.call指令将傳回位址入棧,然後跳到目的位址。ret指令從這樣的過程調用中傳回
6.pushl和popl指令實作了入棧和出棧
7.halt指令停止指令的執行
指令集的一個重要性質就是位元組編碼必須有唯一的解釋
值 | 名字 | 含義 |
1 | AOK | 正常操作 |
2 | HLT | 處理器執行halt指令 |
3 | ADR | 遇到非法位址 |
4 | INS | 遇到非法指令 |
Y86狀态碼(在我們的設計中,任何AOK以外的代碼都會使處理器停止)
對于Y86,當遇到這些異常的時候,我們就簡單的讓處理器停止執行指令。在更完整的設計中,處理器通常會調用一個異常處理程式
YIS:指令集模拟器,它的目的是模拟Y86機器代碼程式的執行,而不用試圖去模拟任何具體處理器實作的行為
大多數Y86指令是以一種直接的方式修改程式狀态的,是以定義每條指令想要達到的結果并不困難
pushl指令會把棧指針減4,并将一個寄存器值寫入存儲器中。是以,當執行pushl%esp指令時,處理器的行為是不确定的,因為要入棧的寄存器會被同一條指令修改.通常有兩種約定(1)壓入%esp的原始值 (2)壓入減去4的%esp的值
對于popl%esp指令也類似。可以将%esp置為從存儲器中讀出的值,也可以置為加上4後的棧指針
HCL(硬體控制語言)表達式 | C語言 | |
AND | && | & |
OR | || | | |
NOT | ! | ~ |
不用C語言的符号是因為邏輯門隻對單個位的數進行操作,而不是整個字
假設我們想設計一個邏輯電路來找一組字A,B,C中的最小值,用HCL來表達就是:
int Min3 =[
A <= B && A <= C : A;
B <= A && B <= C : B;
1 : C;
];
兩類存儲器裝置:時鐘寄存器,随機通路存儲器
處理一條指令包括很多操作(實作所有Y86指令所需要的計算可以組織成的六個基本階段):
1.取指
2.譯碼
3.執行
4.訪存
5.寫回
6.更新PC
處理器從來不需要為了完成一條指令的執行而去讀由該指令更新了的狀态