二、指令系統(tǒng)
(一) 指令集體系結(jié)構(gòu)的分類
1.分類的依據(jù)
從體系結(jié)構(gòu)的觀點(diǎn)對(duì)指令集進(jìn)行分類,可以根據(jù)下述五種尺度:(1)操作數(shù)在CPU中的存儲(chǔ)方式,即操作數(shù)從主存中取來(lái)后要把它保存在什么地方。
(2)顯式操作數(shù)的數(shù)量,即在條典型的指令中有多少個(gè)顯式命名的操作數(shù)。
(3)操作數(shù)的位置,即任一個(gè)ALU指令的操作數(shù)能否放在主存中,或者必須把某些操作甚至全部操作數(shù)都放在CPU的內(nèi)部存儲(chǔ)器中?如果某操作數(shù)要放在主存中,那么它是如何定位的?
(4)指令的操作,即在指令集中提供哪些操作?
(5)操作數(shù)的類型與大小,即每個(gè)操作數(shù)是什么類型、尺寸大小,以及怎樣對(duì)它規(guī)定。
2.按暫存機(jī)制分類
根據(jù)在CPU內(nèi)部存儲(chǔ)操作數(shù)的區(qū)別,可以把指令集體系分為三類。這三類分別為:堆棧(stack)、累加器(accumulator)和寄存器集(a set of registers)。
3.通用寄存器機(jī)的分類
通用寄存器機(jī)(general-purpose register machines)簡(jiǎn)稱GPR機(jī)。GPR的關(guān)鍵性優(yōu)點(diǎn)起因于編譯程序能有效地使用寄存器,無(wú)論是計(jì)算機(jī)表達(dá)式的值,還是從全局的角度使用寄存器來(lái)保存變量的值。在表達(dá)式求解時(shí),寄存器比堆?;蛘呃奂悠髂芴峁└屿`活的次序。更重要的是寄存器能用來(lái)保存變量。當(dāng)變量分配給寄存器時(shí),訪存流量(memory traffic)就會(huì)減少,程序運(yùn)行就會(huì)加速,而且代碼密度也會(huì)得到改善??梢杂弥噶罴膬蓚€(gè)主要特征來(lái)區(qū)分GPR體系結(jié)構(gòu)。這兩個(gè)特征都是關(guān)于ALU指令即典型的算術(shù)邏輯指令中操作數(shù)的本質(zhì)。第一個(gè)是ALU指令有兩個(gè)或三個(gè)操作數(shù)。在三操作數(shù)格式中,指令包括兩個(gè)源操作數(shù)物一個(gè)目的操作數(shù)。在二操作數(shù)格式中,有一個(gè)操作數(shù)既是源操作數(shù)又是目的操作數(shù)。第二個(gè)是ALU指令中有幾個(gè)操作數(shù)是存儲(chǔ)器地址,對(duì)典型的ALU指令,這個(gè)數(shù)可能在1與3之間。
(二) 指令格式及其優(yōu)化
1.指令格式的設(shè)計(jì)考慮對(duì)于指令格式(instruction format)的設(shè)計(jì)有一些優(yōu)先考慮的原則:
(1)關(guān)于指令的長(zhǎng)度,短指令要比長(zhǎng)指令更節(jié)約些。盡管存儲(chǔ)器的價(jià)格越來(lái)越便宜,但設(shè)計(jì)者還是不愿意浪費(fèi)它們。
(2)還要考慮是否有足夠的空間表示所有期望的操作。來(lái)源:www.examda.com
(3)在GPR結(jié)構(gòu)中,無(wú)論是哪種寄存器與存儲(chǔ)器類型,提高存取指令的速度都是應(yīng)該考慮的一個(gè)重要原則。存儲(chǔ)器的存取速度越高,就能給處理機(jī)提供更多的指令進(jìn)行處理。在一定的存取速率下,如果平均指令長(zhǎng)度較短,那么存儲(chǔ)器就能供應(yīng)更多的指令。
(4)機(jī)器字長(zhǎng)(word length)應(yīng)該是字符長(zhǎng)度(character length)的整數(shù)倍。否則,在存儲(chǔ)字符時(shí)就會(huì)造成浪費(fèi),而且也會(huì)造成尋址困難。
(5)尋址字段長(zhǎng)度的選擇。假設(shè)存儲(chǔ)空間是2 19 位,如果存取單位的大小不同,則地址長(zhǎng)度也不相同。
2.指令格式化
指令格式的優(yōu)化既包括指令碼的優(yōu)化,也包括操作數(shù)的優(yōu)化。所謂指令格式的優(yōu)化就是從整個(gè)指令系統(tǒng)的利用率角度出發(fā),盡量設(shè)法減少指令中的冗余信息量,以便用最少的位數(shù)提供足夠的操作信息和地址信息。
3.哈夫曼編碼
哈夫曼編碼的基本概念是:對(duì)發(fā)生概率高的事件用短碼表示,對(duì)發(fā)生概率低的事件用長(zhǎng)碼表示,這樣做的結(jié)果可以使平均編碼長(zhǎng)度明顯壓縮,使之很接近理論編碼長(zhǎng)度。要對(duì)指令碼進(jìn)行優(yōu)化表示,就必須知道每條指令在程度中出現(xiàn)的概率,即指令的使用頻度,一般都是通過(guò)對(duì)大量已有的典型程序進(jìn)行統(tǒng)計(jì)而求得。獲得使用頻度后,即可根據(jù)這些數(shù)據(jù)構(gòu)造一個(gè)哈夫曼樹。具體算法是:把各指令按使用頻度從小到大排序;從中取出最小與次最小的兩個(gè)指令作為葉結(jié)點(diǎn)構(gòu)成二叉樹,其根為兩結(jié)點(diǎn)頻度之和,并把比值插入到頻度序列中;遞歸地使用此法繼續(xù)構(gòu)造二叉樹,直到全部指令都作為葉結(jié)點(diǎn)使用完為止。有了哈夫曼樹(它是一個(gè)二叉樹),即可用它進(jìn)行編碼。具體做法是:從根結(jié)點(diǎn)開始,把樹的左子樹線段標(biāo)為1,右子樹線段標(biāo)為0,直至葉結(jié)點(diǎn)。然后從每個(gè)指令所在的葉結(jié)點(diǎn)位置開始,沿最短路徑到達(dá)各個(gè)葉結(jié)點(diǎn)并依次寫下沿線的0、1序列。就得到該指令的哈夫曼編碼。(三) 指令集的復(fù)雜化