處理器體系結(jié)構(gòu)·四
第4章?處理器體系結(jié)構(gòu)·四
關(guān)鍵詞:處理器體系結(jié)構(gòu),匯編語言,指令集,硬件控制語言,寄存器和存儲器
一個處理器支持的指令和指令的字節(jié)級編碼成為它的ISA(instruction-set architecture,指令集體系結(jié)構(gòu))。
ISA在編譯器編寫者和處理器設(shè)計人員之間提供了一個概念抽象層,編譯器編寫者只需要知道允許哪些指令,以及它們是如何編碼的;而處理器設(shè)計者必須建造出執(zhí)行這些指令的處理器。
4.1 處理器設(shè)計的特點
1 從智力方面來說,處理器設(shè)計是非常有趣的。它需要完成復雜的人物,而結(jié)構(gòu)又要盡可能簡單。
2 理解處理器是如何工作的能幫助理解整個計算機系統(tǒng)是如何工作的。
3 雖然很少有人設(shè)計處理器,但是許多人設(shè)計包含處理器的硬件系統(tǒng)。
4 你的工作可能就是處理器設(shè)計。
4.2 Y86指令集體系結(jié)構(gòu)
Y86的處理器狀態(tài)類似于IA32。有八個寄存器(program register):%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。處理器每個程序寄存器儲存一個字。寄存器%esp被入棧、出棧、調(diào)用和返回指令作為棧指針。而其它寄存器沒有固定的含義或固定值。有三個一位的條件碼(condition
code):ZF、SF、OF,它們保存著最近的算術(shù)或邏輯指令造成影響的信息。程序計數(shù)器(PC)里存放著當前正在執(zhí)行執(zhí)行的地址。存儲器從概念上來說就是一個很大的字節(jié)數(shù)組,保存著程序和數(shù)據(jù)。Y86用虛擬地址來引用存儲器位置。硬件和操作系統(tǒng)如眼見聯(lián)合起來將虛擬地址翻譯成指明數(shù)據(jù)實際存在存儲器中哪個地方的實際或物理地址。
1 Y86的指令細節(jié)
(1)IA32的movl指令分成了四個不同的指令:irmovl、rrmovl、mrmovl、rmmovl,分別顯式地指明源和目的的格式。源可以是立即數(shù)(i)、寄存器(r)或存儲器(m)。指令名字的第一個字母指明了目的的類型。兩個存儲器傳送指令中的存儲器引用方式是簡單的基址加位移形式。在地址計算中,我們不支持第二變址寄存器(second
index register)和任何寄存器值的伸縮(scaling)。同IA32一樣,我們不允許從一個存儲器地址直接傳送到另一個存儲器地址。另外我們也不允許將立即數(shù)傳送到存儲器。
(2)有四個整數(shù)操作指令,就是OPI。它們是addl、subl、andl、xorl。它們只對寄存器數(shù)據(jù)進行操作,而IA32還允許對存儲數(shù)據(jù)進行這些操作。這些指令會設(shè)置三個條件ZF、SF、OF(零、符號、溢出)。
(3)七個跳轉(zhuǎn)指令。是jmp、jle、jl、je、jne、jge、jg。根據(jù)轉(zhuǎn)移指令的類型和條件代碼的設(shè)置來選擇轉(zhuǎn)移。轉(zhuǎn)移條件和IA32的一樣。
(4)call指令返回地址入棧,然后跳到目的地址。ret指令從這樣的過程中返回。
(5)pushl和popl指令實現(xiàn)了入棧和出棧,就像在IA32中一樣。
(6)halt指令停止指令的執(zhí)行。IA32中有一個與之相當?shù)闹噶罱衕lt。IA32的應(yīng)用程序不允許使用這條指令,因為他會導致整個系統(tǒng)停止。在Y86程序中用halt指令來停止模擬器。
指令集的一個重要性質(zhì)就是字節(jié)解釋必須有唯一的解釋。任意一個字節(jié)序列要么是一個唯一的指令蓄力的編碼,要目就不是一個合法的字節(jié)序列。這個性質(zhì)保證了處理器可以無二義性地執(zhí)行目標代碼程序。
2 IA32HE Y86的指令編碼的比較
同IA32中的指令編碼相比,Y86的編碼簡單的多,但是也沒有那么簡潔。在所有的Y86指令中,寄存器字段的位置都是固定的,而在不同的IA32指令中,它們的位置是不一樣的。即使最多只有8個寄存器,我們也對寄存器采用了4位編碼。IA32只用了3位編碼。所以IA32能將入?;虺鰲V噶罘旁谝粋€自接力,5位字段表明指令類型,剩下的3位是寄存器指示符。IA32可以將常數(shù)值編碼成1、2或4個字節(jié),而Y86總是將常熟之編碼成4個字節(jié)。
4.3 邏輯設(shè)計和硬件控制語言HCL
要實現(xiàn)一個數(shù)字系統(tǒng)需要三個主要部分:計算位的函數(shù)的組合邏輯、存儲位的存儲器元素,以及控制存儲器元素更新的時鐘信號。
HCL:(hardware control language),硬件控制語言。
1 HCL和C語言的區(qū)別
(1)因為組合電路是由一些邏輯門組成的,它有兩個屬性就是輸出會持續(xù)地響應(yīng)輸入的變化。相比之下,C表達式只會在程序執(zhí)行過程中被遇到時才進行求值。
(2)C的邏輯表達式允許參數(shù)是任意整數(shù),0表示FALSE,其它任何值都表示TRUE。而我們的邏輯門只對位值0和1進行操作。
(3)C的邏輯表達式有個屬性就是它們可能只被部分求值。如果一個AND或OR操作的結(jié)果只用第一個參數(shù)求值就能確定,那么就不用對第二個參數(shù)求值了。而組合邏輯沒有部分求值這條規(guī)則,邏輯門只是簡單地響應(yīng)它們輸入的變化。
2 存儲器和時鐘控制
組合電路從本質(zhì)上講,不存儲任何信息,相反,它們只是簡單地響應(yīng)輸入信號,產(chǎn)生等于輸入的某個函數(shù)輸出。為了產(chǎn)生時序電路,也就是有狀態(tài)并且在這個狀態(tài)上進行計算的系統(tǒng),我們必須引入按位存儲信息的設(shè)備。
時鐘寄存器:(簡稱寄存器)存儲單個位或字。時鐘信號控制寄存器加載輸入值。
隨機訪問存儲器:(簡稱存儲器),存儲多個字,用地址來選擇該讀或?qū)懩膫€字。
4.4 Y86的順序?qū)崿F(xiàn)
處理一條指令包括很多操作。我們將他們組織成某個特殊的階段序列,使即使指令的動作差異很大,但所有的指令都遵循統(tǒng)一的序列。每一步的具體處理取決于正在執(zhí)行的指令。各個階段以及各階段內(nèi)執(zhí)行操作的簡略描述。
取指(fetch):取指階段從存儲器讀入指令,地址為程序計數(shù)器(PC)的值。
譯碼(decode):譯碼階段從寄存器堆讀入最多兩個操作數(shù)。
執(zhí)行(execute):在執(zhí)行階段,算術(shù)/邏輯單元(ALU)要么執(zhí)行指令指明的操作,計算存儲器引用的有效地址,要么增加或減少棧指針。
訪存(memory)訪存階段可以將數(shù)據(jù)寫入存儲器,或者從存儲器讀出數(shù)據(jù)。
寫回(write back):寫回階段最多可以寫兩個結(jié)果到寄存器堆。
更新PC(PC update):將PC設(shè)置成下一條指令的地址。
處理器無限制地循環(huán)執(zhí)行這些階段,只有在遇到halt指令或一些錯誤情況時,才會停下來。我們處理的錯誤情況包括非法存儲器地址(程序地址或數(shù)據(jù)地址),以及非法指令。
參考文獻
布賴恩特, O'Hallaron D, et al. 深入理解計算機系統(tǒng)[M]. 中國電力出版社, 2004.