第三章指令集結(jié)構(gòu)_第1頁
第三章指令集結(jié)構(gòu)_第2頁
第三章指令集結(jié)構(gòu)_第3頁
第三章指令集結(jié)構(gòu)_第4頁
第三章指令集結(jié)構(gòu)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第三章

結(jié)

構(gòu)

指令集結(jié)構(gòu)(instructionsetarchitecture)

,即ISA,是微處理器的接口,包含了與該微處理器進(jìn)行交互所需要的信息,但并不涉及微處理器自身如何設(shè)計(jì)和實(shí)現(xiàn)的細(xì)節(jié)。

什么是指令集結(jié)構(gòu)?

ISA包括:微處理器的指令集、程序員可直接訪問的寄存器的細(xì)節(jié)、訪問內(nèi)存所需的信息、微處理器如何響應(yīng)中斷。1.程序設(shè)計(jì)語言的級(jí)別2.匯編語言指令3.指令集結(jié)構(gòu)設(shè)計(jì)4.兩種微處理器(相對(duì)簡單CPU和8085微處理器)的指令集結(jié)構(gòu)主要內(nèi)容:3.1程序設(shè)計(jì)語言的級(jí)別

3.1.1語言種類

高級(jí)語言(high-levellanguages)

匯編語言(assemblylanguage)

向下兼容(backwardcompatible)

平臺(tái)無關(guān)(platform-independent)

機(jī)器語言3.1.2編譯和匯編程序1.編譯、匯編2.編譯器

源程序、源代碼、目標(biāo)代碼連接器、裝載器3.編譯過程同一高級(jí)語言源代碼可以經(jīng)過編譯在不同的微處理器和操作系統(tǒng)或者計(jì)算平臺(tái)上運(yùn)行。

圖3.1高級(jí)程序的編譯過程裝載器包含在計(jì)算平臺(tái)中

4.匯編器和匯編過程

圖3.2匯編語言程序的匯編過程每一種匯編語言對(duì)應(yīng)一種微處理器,不需要針對(duì)不同平臺(tái)的匯編器。3.2匯編語言指令3.2.1指令類型3.2.1.1數(shù)據(jù)傳送指令

將數(shù)據(jù)從一個(gè)地方移到另一個(gè)地方(實(shí)際是“拷貝”),包括:內(nèi)存取數(shù)據(jù)到微處理器、微處理器中的數(shù)據(jù)存到內(nèi)存、微處理器內(nèi)移動(dòng)數(shù)據(jù)、輸入數(shù)據(jù)到微處理器、從微處理器輸出數(shù)據(jù)。3.2.1.2數(shù)據(jù)運(yùn)算指令包括算術(shù)運(yùn)算指令、邏輯運(yùn)算指令、移位指令。3.2.1.3程序控制指令控制程序流程的指令,包括:跳轉(zhuǎn)指令(條件或無條件)或分支指令、子程序調(diào)用和子程序返回指令、“軟中斷”指令、停機(jī)指令。3.2.2數(shù)據(jù)類型

數(shù)值數(shù)據(jù)

無符號(hào)整型數(shù)、有符號(hào)整型數(shù)、浮點(diǎn)數(shù)據(jù)

布爾類型

數(shù)據(jù)值常以0表示FALSE,以非0表示TRUE

字符數(shù)據(jù)

字符編碼標(biāo)準(zhǔn)(ASCII、EBCDIC、UNICODE、或別的)3.2.3尋址方式

尋址方式(addressingmodes):確定操作數(shù)地址的方法。3.2.3.1直接尋址在該尋址方式中,指令包含有要訪問單元的內(nèi)存地址。

例如:LDAC

5

從內(nèi)存單元5讀取數(shù)據(jù)并且把數(shù)據(jù)存儲(chǔ)在CPU的累加器中。3.2.3.2間接尋址指令中指定的是含有操作數(shù)地址的內(nèi)存單元的地址。

OP…5IR10操作數(shù)35操作數(shù)的地址105…例如:LDAC@5或LDAC(5)要進(jìn)行兩次內(nèi)存訪問。例如:假設(shè)寄存器R中存儲(chǔ)了數(shù)值5,則:

LDAC

R;把數(shù)值5從寄存器R中拷貝到CPU的累加器中

LDAC(R)或LDAC@R;相當(dāng)于LDAC

5,從寄存器R中獲取地址3.2.3.4立即值尋址指定的操作數(shù)不是一個(gè)地址,而是確實(shí)要用到的數(shù)據(jù)。例如:LDAC

#5;把數(shù)據(jù)值5移到累加器中3.2.3.3寄存器直接尋址和寄存器間接尋址

與直接和間接尋址方式相似,但指定的寄存器,而不是內(nèi)存單元。3.2.3.5隱含尋址并不明確地指出操作數(shù),因?yàn)榭偸怯玫教囟ǖ募拇嫫鳌@纾?/p>

CLAC;清空CPU中的累加器,即將其值置為0常用于用堆棧存儲(chǔ)數(shù)據(jù)的CPU中。指令中不需要指定操作數(shù),因?yàn)樗凳静僮鲾?shù)一定來自堆棧。

3.2.3.6相對(duì)尋址該方式中,操作數(shù)不直接提供地址,而是提供一個(gè)偏移量。它與CPU中程序計(jì)數(shù)器的內(nèi)容相加生成所需的地址。

程序計(jì)數(shù)器存有當(dāng)前正在執(zhí)行指令的地址。例如:LDAC

$5

;若該指令定位于內(nèi)存單元10,且它占用兩個(gè)內(nèi)存單元,

;則下一條指令會(huì)位于單元12,指令從單元(12+5=17)

;讀取17號(hào)單元中的數(shù)據(jù)并且把它存于累加器中。該尋址方式對(duì)于短跳轉(zhuǎn)和可重定位代碼很有用。

3.2.3.7變址尋址方式和基址尋址

變址尋址方式與相對(duì)尋址方式類似,但它是將指令提供的地址與變址寄存器中而不是程序計(jì)數(shù)器中的內(nèi)容相加。

例如:

LDAC5(X)

;變址寄存器X:數(shù)值10,則5+10=15

;讀取15號(hào)單元中的數(shù)據(jù)并且把它存儲(chǔ)在累加器中。

除了用基址寄存器替換變址寄存器外,基址尋址方式和變址尋址方式完全一樣。

3.2.4指令格式

指令代碼(instructioncode):匯編語言指令轉(zhuǎn)換成對(duì)應(yīng)的機(jī)器代碼,以二進(jìn)制數(shù)值的形式表現(xiàn)。

操作碼地址碼指令的基本格式為:

考慮一個(gè)簡單的例子:A=B+C一個(gè)操作:加法三個(gè)操作數(shù):兩個(gè)源操作數(shù)——B、C一個(gè)目的操作數(shù)——A假定微處理器可以執(zhí)行16種不同的操作。需要4位來代表其中的操作(因?yàn)?4=16)(假設(shè)位模式1010→加法)假定僅有4種可能的操作數(shù)——A,B,C和D。用兩位來表示每一種操作數(shù):

00→A,01→B,10→C,11→D圖3.4采用(a)三操作數(shù),(b)二操作數(shù),(c)單操作數(shù),(d)0操作數(shù)的指令格式和計(jì)算A=B+C的匯編語言程序以及機(jī)器代碼。

微處理器可以設(shè)計(jì)成能運(yùn)行具有3、2、1或0個(gè)操作數(shù)的指令。

查看圖3.4的代碼,我們能發(fā)現(xiàn)較少的操作數(shù)通常轉(zhuǎn)化為較多的指令來完成同樣的任務(wù)。本例子簡單地說明了三,二,一和零操作數(shù)指令的不同。實(shí)際上,這些指令需要比本例更多的位數(shù)。一個(gè)操作數(shù)字段可以指定一個(gè)任意的內(nèi)存地址,而不只是四個(gè)寄存器中的一個(gè)。每個(gè)操作數(shù)可能需要16、32甚至更多的位數(shù)。另外還需要一些位用于指定每個(gè)操作數(shù)的尋址方式。

3.3指令集結(jié)構(gòu)設(shè)計(jì)

完整性問題:該指令集是否有足夠的指令可以讓程序完成它必須的任務(wù)?

正交性問題:如果指令不重疊或者不執(zhí)行同樣的操作,那么它們就是正交的。在最小的指令集中為程序員提供必需的操作。

設(shè)計(jì)者可以優(yōu)化ISA的另一個(gè)地方就是寄存器組。本小節(jié):分析設(shè)計(jì)一套指令集結(jié)構(gòu)時(shí)應(yīng)考慮哪些問題?要考慮的其它問題:。處理器必須向下兼容其它的微處理器嗎?。微處理器將處理何種類型和大小的數(shù)據(jù)?

。需要中斷嗎?。需要條件指令嗎?3.4相對(duì)簡單的指令集結(jié)構(gòu)存儲(chǔ)器模型:該微處理器可以訪問64K(=216)字節(jié)的存儲(chǔ)器(每字節(jié)8位)或者64K×8的存儲(chǔ)器。從外部設(shè)備輸入數(shù)據(jù)和輸出數(shù)據(jù)到外部設(shè)備,都可以被看作是訪問內(nèi)存。有三個(gè)寄存器:累加器(AC)、寄存器R、1位零標(biāo)志Z。包含16條指令,每一條都是8位指令碼,見表3.1

表3.1相對(duì)簡單CPU的指令集LDAC、STAC、JUMP、JMPZ和JPNZ指令都需要16位的存儲(chǔ)地址。這些指令在存儲(chǔ)器中每個(gè)都需要3字節(jié)。第一個(gè)字節(jié)包含指令的操作碼,另外兩字節(jié)對(duì)應(yīng)地址。

3字節(jié)格式1字節(jié)格式

相對(duì)簡單CPU的指令格式。例如:25:JUMP1234H該指令以如下形式存儲(chǔ)在存儲(chǔ)器中:

25:00000101(JUMP)26:00110100(34H)27:00010010(12H)注意:第二字節(jié)低8位,第三字節(jié)高8位指令集結(jié)構(gòu)的用法舉例:用相對(duì)簡單CPU編程計(jì)算1+2+……+n,或者。

則其高級(jí)語言的代碼片斷如下:可以把數(shù)值n存儲(chǔ)在標(biāo)明為n的存儲(chǔ)單元中,結(jié)果存在標(biāo)明為total的內(nèi)存單元處,內(nèi)存單元i用于存儲(chǔ)求和的次數(shù)。確定運(yùn)算步驟如下:

total=0;FORi=1TOnDO{total=total+i};1:total=0,i=02:i=i+13:total=total+i4:IFi≠nTHENGOTO2實(shí)現(xiàn)這一算法的相對(duì)簡單CPU的代碼如下:CLACSTACtotalSTACiLoop:LDACiINACSTACiMVACLDACtotalADDSTACtotalMVACLDACnSUBJPNZLooptotal=0,i=0i=i+1total=total+iIFi≠nTHENGOTOLoop下表顯示了當(dāng)n=5時(shí)代碼的運(yùn)行過程:表3.2循環(huán)求和程序的執(zhí)行步驟

怎樣看待這個(gè)指令集結(jié)構(gòu)?它滿足了以教學(xué)為目的的設(shè)計(jì)目標(biāo)。當(dāng)我們?cè)诘?和7章中設(shè)計(jì)這種CPU時(shí)我們就會(huì)看到,其復(fù)雜度足以闡明很多CPU的設(shè)計(jì)原則,卻又沒有掉進(jìn)自身復(fù)雜度的陷阱中。對(duì)于簡單的應(yīng)用程序來說,指令集完整。如果一個(gè)應(yīng)用程序需要使用浮點(diǎn)型數(shù)據(jù),它就不是十分完整。對(duì)于通用計(jì)算機(jī)(例如個(gè)人計(jì)算機(jī)),該指令集顯然是不夠的。該指令集是相當(dāng)正交的。只是多了OR指令,但有時(shí)CPU的指令集不是完全正交更好一些。

寄存器組是它最大的弱點(diǎn)。寄存器的缺乏導(dǎo)致執(zhí)行任務(wù)較慢,并且降低了性能。3.5實(shí)例:8085微處理器指令集結(jié)構(gòu)3.5.18085微處理器的寄存器組通用數(shù)據(jù)寄存器:

累加寄存器A-總是接收一個(gè)8位的算術(shù)或邏輯指令的結(jié)果;也為所有采用二操作數(shù)的指令提供一個(gè)操作數(shù)。

六個(gè)通用寄存器-命名為B,C,D,E,H和L,可成對(duì)訪問:B和C,D和E,H和L。寄存器對(duì)HL常用來指向內(nèi)存單元。

16位的堆棧指針寄存器SP:包含堆棧頂部的地址。

5個(gè)標(biāo)志,共同稱為標(biāo)志寄存器:●符號(hào)標(biāo)志S:表明算術(shù)或邏輯指令計(jì)算出的結(jié)果的符號(hào)。其中,值1表示負(fù)數(shù);值0表示正數(shù)(或零)?!窳銟?biāo)志Z:如果算術(shù)或邏輯運(yùn)算指令產(chǎn)生的結(jié)果為0,則將Z置為1;否則Z為0?!衿媾紭?biāo)志P:如果算術(shù)或邏輯運(yùn)算結(jié)果中有偶數(shù)個(gè)1,則將P置為1;否則P為0?!襁M(jìn)位標(biāo)志CY:當(dāng)算術(shù)運(yùn)算產(chǎn)生進(jìn)位時(shí)才去設(shè)置它。

例如,加法11110000+10000000=101110000,對(duì)兩個(gè)8位值相加但產(chǎn)生了9位結(jié)果。最左邊的1被存儲(chǔ)在CY中;如果加法不產(chǎn)生進(jìn)位1,則CY中會(huì)存儲(chǔ)0?!褫o助進(jìn)位標(biāo)志AC:與進(jìn)位標(biāo)志類似。它不指明進(jìn)位值,但指出從結(jié)果的低四位向高四位傳遞了進(jìn)位。例如,加法00001111+00001000=00010111中斷標(biāo)志寄存器IM:用于允許和禁止中斷而且檢查待處理的中斷。程序員可以讀取并且設(shè)置該寄存器中的值來處理中斷。

3.5.28085微處理器指令集8085指令集總共包含了74條指令。可分為三個(gè)部分:數(shù)據(jù)傳送指令、數(shù)據(jù)運(yùn)算指令和程序控制指令。采用如下記號(hào)描述:●

r,r1,r2:表示任何一個(gè)8位寄存器A,B,C,D,E,H,或者L。

M:表示內(nèi)存單元。M[HL]表明該內(nèi)存單元的地址存在寄存器對(duì)HL中。

rp:表示寄存器對(duì)BC,DE,HL,或者堆棧指針SP。

Г:一個(gè)16位地址或者數(shù)據(jù)。●

n:是一個(gè)存儲(chǔ)在內(nèi)存中且緊跟操作碼后的8位地址或者數(shù)據(jù)值。●

cond:條件指令的一個(gè)條件。值為:NZ、Z、P、N、PO、PE、NC、C。除了POPPSW指令外,其它指令都不會(huì)修改標(biāo)志的值。

(PSW:處理器狀態(tài)字(保存累加器和標(biāo)志器中的內(nèi)容))表3.38085微處理器的數(shù)據(jù)傳送指令

(立即尋址)(直接尋址)

指令的通用格式。一些指令有指定寄存器的字段,而另一些指令這些部分卻是固定的。

圖3.68085的指令格式一字節(jié)二字節(jié)三字節(jié)數(shù)據(jù)運(yùn)算指令大多數(shù)會(huì)影響表中的標(biāo)志。

表3.48085微處理器的數(shù)據(jù)運(yùn)算指令

13條程序控制指令。DI,EI,RIM和SIM包含在此因?yàn)樗鼈兛梢蕴幚碇袛?,而中斷最終又會(huì)影響程序控制。這些指令都不修改標(biāo)志。

表3.58085微處理器的程序控制指令

3.5.3一個(gè)簡單的8085程序計(jì)算和1+2+……+n,并且把結(jié)果存儲(chǔ)于內(nèi)存單元total中。n值最初存于標(biāo)志為n的內(nèi)存單元中。

當(dāng)設(shè)計(jì)此程序時(shí),我們計(jì)算如n+(n-1)+……+1形式的總和。

算法如下:與相對(duì)簡單CPU中的程序不同,8085程序把它的運(yùn)行值存儲(chǔ)在CPU寄存器中。寄存器B包含數(shù)值i,總和存儲(chǔ)在寄存器A中。1:i=n,sum=02:sum=sum+i,i=i-13:IFi≠0THENGOTO24:total=sum執(zhí)行該算法的8085代碼如下:LDAnMOVB,AXRAA}sum=A?A=0Loop:ADDB}sum=sum+iDCRB}i=i-1JNZLoop}IFi≠0THENGOTOLoopSTAtotal}total=sumi=n運(yùn)行值存儲(chǔ)在CPU寄存器,減少了內(nèi)存訪問次數(shù),程序更短、運(yùn)行速度更快

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論