CPU內(nèi)部的寄存器,機(jī)器代碼指令集以及指令與寄存器和狀態(tài)標(biāo)志的交互方式都是相互交織的。
您可能還記得,我的背景愛(ài)好項(xiàng)目之一是構(gòu)建4位HRRG計(jì)算機(jī)。在整個(gè)時(shí)間范圍內(nèi),這將實(shí)現(xiàn)為壁掛式玻璃前木柜的集合,每個(gè)木柜都包含計(jì)算機(jī)的一部分。每個(gè)機(jī)柜的功能將通過(guò)不同的實(shí)施技術(shù)實(shí)現(xiàn),包括繼電器,真空管,晶體管和軟糖集成電路,以及磁,機(jī)械和氣動(dòng)/液壓產(chǎn)品。
我在這個(gè)項(xiàng)目上的“犯罪伙伴”是我的好友EEWeb專家Joe Farr。Joe致力于創(chuàng)建將在PC上運(yùn)行的計(jì)算機(jī)的虛擬表示形式。我們希望能夠在不久的將來(lái)使此HRRG仿真器可供任何人使用。同時(shí),我目前正在討論“野獸”的物理實(shí)現(xiàn)。
實(shí)話實(shí)說(shuō),這個(gè)項(xiàng)目已經(jīng)擱置了相當(dāng)長(zhǎng)的時(shí)間。實(shí)際上,直到我的好友James“ Chewy” Vorman才在2018年底向我發(fā)送電子郵件,說(shuō)他正計(jì)劃建造4位計(jì)算機(jī),并詢問(wèn)我是否對(duì)喬和我當(dāng)時(shí)的指令集有任何想法。促使他們采取行動(dòng)。
在今年年初,我在“初次通過(guò)指令集”上發(fā)布了一篇專欄文章,這幾乎是喬和我在時(shí)間的迷霧中留下的東西的地方。從那時(shí)起,我們一直在反復(fù)地反復(fù)提出想法。除此之外,Joe啟動(dòng)并運(yùn)行了仿真器后,他很快就厭倦了用機(jī)器代碼編寫(xiě)和輸入測(cè)試程序,這促使他創(chuàng)建了一個(gè)笨拙的HRRG終端和HRRG匯編器。
運(yùn)行HRRG匯編程序的HRRG終端。(來(lái)源:?jiǎn)獭し枺?/p>
當(dāng)然,這不是真正的Sperry Univac Uniscope 200,它只是Joe決定將其朋友好友收藏中的一個(gè)圖像用作HRRG終端的背景,該終端(在此屏幕快照中)正在運(yùn)行HRRG匯編程序。當(dāng)我問(wèn)喬為什么選擇這種設(shè)備時(shí),他回答說(shuō)有兩個(gè)原因。首先是右側(cè)的面板為他提供了足夠的空間來(lái)添加7段LED,常規(guī)LED,開(kāi)關(guān),磁盤(pán)驅(qū)動(dòng)器和紙帶打孔器的圖像(老實(shí)說(shuō),我什至沒(méi)有意識(shí)到這些不是物理設(shè)備的一部分);第二個(gè)原因是他太懶了,無(wú)法在自己的車(chē)間里搜尋成堆的設(shè)備來(lái)追蹤他的舊DEC VT100終端。
關(guān)鍵是,在創(chuàng)建諸如井字游戲(Tic-Tac-Toe)之類的程序時(shí)(如上面的屏幕截圖所示),喬發(fā)現(xiàn)我們的指令集提供了比我們完全掌握的功能更多的功能(這就是我們的優(yōu)勢(shì))。他還發(fā)現(xiàn)了一些需要“調(diào)整”以使情況變得更好的事情,例如當(dāng)將INC和DEC指令應(yīng)用于IX(索引)寄存器之類的12位寄存器時(shí),它們會(huì)修改N狀態(tài)標(biāo)志。
因此,為了使您了解最新信息,以下內(nèi)容將介紹HRRG的CPU寄存器和指令集的當(dāng)前運(yùn)行狀態(tài)。
CPU寄存器
請(qǐng)記住,HRRG具有4位數(shù)據(jù)總線和12位地址總線。另外,我們使用術(shù)語(yǔ)nybble(或半字節(jié))來(lái)指代4位值;同樣,我們使用“ $”字符表示十六進(jìn)制值(例如,$ A),使用“%”字符表示二進(jìn)制值(例如,%1010)。
為了使程序保持“均值”,我們決定將用戶可訪問(wèn)的寄存器限制為1個(gè)半字節(jié)標(biāo)識(shí)符,這意味著我們將自己限制為僅16個(gè)寄存器,如下所示:
CPU寄存器(來(lái)源:Max Maxfield)
一些早期的8位CPU具有一個(gè)稱為累加器(ACC)的特殊寄存器,該寄存器從內(nèi)存中加載值,并存儲(chǔ)邏輯和算術(shù)運(yùn)算的任何結(jié)果。其他CPU有兩個(gè)累加器ACCA和ACCCB,而其他CPU選擇了一堆通用寄存器。在我們的案例中,我們決定有六個(gè)通用4位寄存器R0至R5。我們還有兩個(gè)狀態(tài)寄存器S0和S1。
除了物理尋址邏輯寄存器PC,SP,IX,IV和TA外,我們還有三個(gè)虛擬寄存器CV,MD和MX。我們將看到這些虛擬寄存器如何在整個(gè)時(shí)間范圍內(nèi)發(fā)揮其魔力??梢哉f(shuō)我還沒(méi)有在其他任何地方見(jiàn)過(guò)像我們的虛擬寄存器概念這樣的東西。
狀態(tài)寄存器
如前所述,HRRG具有兩個(gè)狀態(tài)寄存器S0和S1。這些寄存器的內(nèi)容如下所示。
狀態(tài)寄存器(來(lái)源:Max Maxfield)
大多數(shù)微處理器具有多個(gè)跳轉(zhuǎn)指令,例如JMP(無(wú)條件跳轉(zhuǎn)),JPN(如果為負(fù)則跳轉(zhuǎn)),JPNN(如果不是負(fù)則跳轉(zhuǎn)),JPZ(如果為零則跳轉(zhuǎn)),JPNZ(如果不為零則跳轉(zhuǎn))等等。但是,通常只有一條JSR(跳轉(zhuǎn)到子例程)指令。
對(duì)于HRRG,我們只有一對(duì)JMP(跳轉(zhuǎn))和JSR(跳轉(zhuǎn)到子例程)指令。但是,正如我們將看到的,這些指令的一個(gè)很酷的事情是它們的跳轉(zhuǎn)/不跳轉(zhuǎn)動(dòng)作可以由兩個(gè)狀態(tài)寄存器中任何位的0/1值控制(在這種情況下, JMP和JSR指令將兩個(gè)4位狀態(tài)寄存器視為單個(gè)8位寄存器)。
N,Z,C和O標(biāo)志以通常的方式運(yùn)行(對(duì)于初學(xué)者,我們將在以后的專欄中更詳細(xì)地討論這些標(biāo)志的操作)。
I(中斷屏蔽)標(biāo)志的狀態(tài)決定了CPU是否將看到并響應(yīng)外部中斷:此標(biāo)志中的0表示CPU將不響應(yīng);否則標(biāo)志將變?yōu)?。該標(biāo)志中的1表示CPU將響應(yīng)。該標(biāo)志加電時(shí)包含0,由用戶(即用戶的程序)將其設(shè)置為1。如果CPU復(fù)位,則該標(biāo)志將被清除為0。
H(停止)標(biāo)志指示CPU是運(yùn)行還是停止:該標(biāo)志中的0表示CPU將運(yùn)行;否則,CPU停止運(yùn)行。該標(biāo)志中的1表示CPU將停止操作。該標(biāo)志加電包含0。由用戶決定是否在程序控制下將其設(shè)置為1。使暫停標(biāo)志返回0的唯一方法是復(fù)位CPU或外部中斷喚醒CPU(假定中斷屏蔽標(biāo)志設(shè)置為1)。
關(guān)于狀態(tài)寄存器S1的位2和3(組合的8位寄存器的位6和7)中的硬連接0和1值,如果選擇了1,則JMP和JSR指令將使用這些值來(lái)實(shí)現(xiàn)無(wú)條件跳轉(zhuǎn),如果選擇了0,則為無(wú)條件跳轉(zhuǎn)(用于調(diào)試目的)。
指令集
這是開(kāi)始變得有趣的地方,因?yàn)檫@是我們決定要支持的低級(jí)指令以及這些指令將如何與CPU寄存器和狀態(tài)標(biāo)志交互的地方。
指令集。(來(lái)源:馬克斯·麥克菲爾德(Max Maxfield)
我知道,我知道,當(dāng)您第一次看到它時(shí),這確實(shí)有些令人生畏,但這主要是因?yàn)槲覀冋噲D將大量信息塞入一個(gè)很小的空間中。
假設(shè)我們要減少通用寄存器R3的4位內(nèi)容。在這種情況下,我們的指令將包含兩個(gè)半字節(jié):$ 1 $ 3,我們可以將其寫(xiě)為$ 13,其中$ 1是DEC(減量)指令的操作碼,而$ 3是指定寄存器R3的
現(xiàn)在假設(shè)我們要增加12位地址為$ 123的存儲(chǔ)單元的4位內(nèi)容。在這種情況下,生成的機(jī)器代碼將是$ 0 $ E $ 1 $ 2 $ 3,我們可以將其寫(xiě)為$ 0E123,其中$ 0是INC(增量)指令的操作碼,$ E是
作為當(dāng)前的最后一個(gè)示例,讓我們假設(shè)我們想將%1010的值(十六進(jìn)制的$ A)移動(dòng)(復(fù)制)到內(nèi)存位置$ 324中。在這種情況下,生成的機(jī)器代碼將為$ F $ D $ E $ A $ 3 $ 2 $ 4,我們可以將其寫(xiě)為$ FDEA321,其中$ F是MOV(移動(dòng))指令的操作碼,$ D是
我們將在接下來(lái)的兩列中回顧這些機(jī)器代碼指令和等效的匯編語(yǔ)言(相信我,當(dāng)我們開(kāi)始考慮匯編語(yǔ)言時(shí),情況會(huì)變得更加清晰)。目前,請(qǐng)仔細(xì)閱讀并仔細(xì)考慮以下注意事項(xiàng)(其編號(hào)與上表中的編號(hào)匹配),其中對(duì)這些內(nèi)容進(jìn)行了非常詳細(xì)的總結(jié)。
#1如果源是CPU的4位或12位物理寄存器之一,則不會(huì)有
#2如果源是存儲(chǔ)位置(使用MD或MX虛擬寄存器指示),則
#3如果源是一個(gè)常量值(如CV虛擬寄存器所示),則如果目標(biāo)是4位寄存器或存儲(chǔ)位置,則
#4如果目標(biāo)是CPU的4位或12位物理寄存器之一,則不會(huì)有
#5如果目標(biāo)是內(nèi)存位置(如使用MD或MX虛擬寄存器指示的),則
#6如果源是4位寄存器,則目標(biāo)通常是4位寄存器或存儲(chǔ)器位置;否則,目標(biāo)將是4位寄存器或存儲(chǔ)位置。如果源是4位寄存器,而目標(biāo)是12位寄存器(PC,SP,IX,IV,TA)之一,則4位寄存器的內(nèi)容將被移入(復(fù)制)到最小-目標(biāo)寄存器的顯著半字節(jié)(LSN);如果源是12位寄存器之一(PC,SP,IX,IV,TA),則目標(biāo)通常是12位寄存器或存儲(chǔ)器位置(請(qǐng)參閱注釋7);如果源是12位寄存器,而目標(biāo)是4位寄存器,則12位寄存器的LSN的內(nèi)容將被復(fù)制到4位寄存器中。
#7如果將12位寄存器的內(nèi)容復(fù)制到內(nèi)存中,則目標(biāo)操作數(shù)將是3個(gè)半字節(jié)字段的最低有效地址。如果將存儲(chǔ)器的內(nèi)容復(fù)制到12位寄存器中,則源操作數(shù)將是3個(gè)半字節(jié)字段的最低有效地址。
#8如果源是4位寄存器或存儲(chǔ)器位置,則將1個(gè)半字節(jié)值壓入堆棧,并且SP = SP +1;如果源是12位寄存器,則將3個(gè)半字節(jié)值壓入堆棧,并且SP = SP + 3;按下PUSH之后,堆棧指針將遞增。
#9如果源是一個(gè)常數(shù)值,則源操作數(shù)將是1個(gè)半字節(jié)值,該值將被壓入堆棧,并且SP = SP + 1(在PUSH之后堆棧指針將遞增)。
#10如果目標(biāo)是4位寄存器或內(nèi)存位置,則SP = SP – 1且將向堆棧彈出一個(gè)1字節(jié)的值(即,堆棧指針將在POP之前遞減)。如果目標(biāo)是一個(gè)12位寄存器,則將從堆棧中彈出一個(gè)3位值(以SP = SP – 3結(jié)尾)。
#11沒(méi)有RTS(“從子程序返回”)或RTI(“從中斷返回”)指令–通過(guò)使用POP指令從堆棧中檢索返回地址并將其加載到PC中,可以達(dá)到相同的效果。
#12 JMP和JSR指令后跟控制小節(jié),然后是3小節(jié)目標(biāo)地址??刂瓢胱止?jié)用于執(zhí)行無(wú)條件跳轉(zhuǎn)或有條件跳轉(zhuǎn)??刂瓢胱止?jié)的最低有效三位指向由S1和S0組成的8位狀態(tài)寄存器中的要測(cè)試的位;范圍是000到111(0到7)。假設(shè)控制半字節(jié)的最高有效位為0,則所選狀態(tài)位的值為1會(huì)導(dǎo)致跳轉(zhuǎn);否則,該值將變?yōu)?。例如,JMP%0001 <目標(biāo)地址>等效于“如果為零則跳轉(zhuǎn)”。相比之下,控制半字節(jié)最高有效位中的1將反轉(zhuǎn)跳轉(zhuǎn)的操作。例如,JMP%1001 <目標(biāo)地址>等同于“如果不為零則跳轉(zhuǎn)”。請(qǐng)注意,狀態(tài)位7 [S1中的位3]是硬連線的1,
指令和狀態(tài)寄存器
最后(并非暫時(shí)),下表總結(jié)了執(zhí)行各種指令影響狀態(tài)寄存器中標(biāo)志的方式。
指令和狀態(tài)位(來(lái)源:Max Maxfield)
您可以想象,設(shè)計(jì)計(jì)算機(jī)是一個(gè)反復(fù)的過(guò)程,事實(shí)證明,擁有Joe的仿真器是無(wú)價(jià)的。例如,只有當(dāng)Joe開(kāi)始編寫(xiě)一個(gè)播放井字游戲的程序時(shí),我們才意識(shí)到,使用12-像IX(索引寄存器)這樣的位寄存器,因此我們將其添加到規(guī)范中(在物理實(shí)現(xiàn)中僅包含一件事。
以下注釋更詳細(xì)地說(shuō)明了上表的內(nèi)容:
#1將目標(biāo)值的最高有效位(MSB)復(fù)制到C標(biāo)志中;同時(shí),將C標(biāo)志的原始內(nèi)容復(fù)制到目標(biāo)值的最低有效位(LSB)。
#2將目標(biāo)值的最低有效位(LSB)復(fù)制到C(進(jìn)位)標(biāo)志;同時(shí),將C標(biāo)志的原始內(nèi)容復(fù)制到目標(biāo)值的最高有效位(MSB)。
#3如果比較的值相等,則Z標(biāo)志設(shè)置為1,否則將其清除為0。
#4被比較的值被認(rèn)為是無(wú)符號(hào)整數(shù)。如果
#5如果目標(biāo)是狀態(tài)寄存器S1,則將從堆棧中加載其標(biāo)志,并且不會(huì)影響S0的內(nèi)容;如果目標(biāo)是S0,那么將從堆棧中加載其標(biāo)志;如果目標(biāo)是其他任何4位位置(寄存器或內(nèi)存),則N和Z標(biāo)志將照常運(yùn)行。
#6這些標(biāo)志對(duì)于4位目標(biāo)照常工作,但有一個(gè)例外-如果目標(biāo)是狀態(tài)寄存器S0或S1之一,則S0中的標(biāo)志將不會(huì)自動(dòng)更新;否則,這些標(biāo)志將自動(dòng)更新。如果源是12位寄存器,而目標(biāo)是4位寄存器,則Z和N標(biāo)志將基于12位寄存器的最低有效字節(jié)的內(nèi)容(即,復(fù)制);如果源是12位寄存器,而目標(biāo)是存儲(chǔ)器,則將基于整個(gè)12位寄存器的內(nèi)容設(shè)置Z標(biāo)志,并且將基于N位的最高有效字節(jié)的內(nèi)容設(shè)置N標(biāo)志。 12位寄存器。
#7將根據(jù)整個(gè)12位寄存器的內(nèi)容設(shè)置Z標(biāo)志,并根據(jù)12位寄存器的最高有效半字節(jié)的內(nèi)容設(shè)置N標(biāo)志。
編輯:hfy
-
繼電器
+關(guān)注
關(guān)注
132文章
5354瀏覽量
149149 -
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120609 -
cpu
+關(guān)注
關(guān)注
68文章
10876瀏覽量
212122 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7513瀏覽量
88173
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論