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