




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第2章微機(jī)系統(tǒng)中的微處理器2.18086的內(nèi)部結(jié)構(gòu)
2.28086的寄存器結(jié)構(gòu)
2.38086的存儲器組織2.48086的I/O組織2.58086的尋址方式2.6高檔微處理器的寄存器結(jié)構(gòu)和存儲器組織簡介
小結(jié)
習(xí)題二 2.18086的內(nèi)部結(jié)構(gòu)
與奔騰系列微處理器相比,8086微處理器是比較簡單的。但是通過對它的學(xué)習(xí),可以掌握微處理器的主要功能和計(jì)算機(jī)的基本工作原理。第3章匯編語言程序設(shè)計(jì)和以下幾章的學(xué)習(xí)正是以8086微處理器為基礎(chǔ)的。
微處理器是組成計(jì)算機(jī)系統(tǒng)的核心部件,它的結(jié)構(gòu)必須與它要完成的基本功能相適應(yīng)。處理器的基本功能如下:
(1)支持功能完善的指令系統(tǒng),進(jìn)行各種算術(shù)邏輯運(yùn)算,通過程序完成復(fù)雜的科學(xué)計(jì)算。
(2)支持各種結(jié)構(gòu)的程序的執(zhí)行,如程序的分支、循環(huán)、嵌套、子程序的調(diào)用和返回、中斷服務(wù)程序等。
(3)控制與存儲器、外部設(shè)備等相連接,組成完整的微機(jī)系統(tǒng)。
圖2.1是8086的功能結(jié)構(gòu)圖。它由兩個獨(dú)立的邏輯單元組成,一個稱為總線接口單元BIU(BusInterfaceUnit),另一個稱為執(zhí)行單元EU(ExecutionUnit)。
總線接口單元BIU的任務(wù)是:
(1)對存儲器的訪問,包括從存儲器取出程序中的指令,暫存起來待用;從存儲器中讀取參加運(yùn)算的數(shù)據(jù)和把運(yùn)算的中間結(jié)果及最后結(jié)果寫入存儲器。圖2.18086功能結(jié)構(gòu)
(2)與I/O設(shè)備之間的信息傳輸。其中的段寄存器(CS、DS、ES、SS)、指令指針I(yè)P(相當(dāng)于程序計(jì)數(shù)器PC)以及數(shù)據(jù)總線上的代碼,共同形成訪問存儲器地址和I/O設(shè)備的地址。指令隊(duì)列寄存器暫存多條指令等待執(zhí)行。訪問存儲器和I/O設(shè)備要通過CPU總線實(shí)現(xiàn)。CPU總線包括地址總線、數(shù)據(jù)總線和控制總線。
微處理器CPU、CPU總線與存儲器和輸入輸出設(shè)備之間的連接關(guān)系如圖2.2所示。圖2.28086與存儲器、I/O設(shè)備的連接執(zhí)行單元EU由算術(shù)邏輯運(yùn)算單元ALU、暫存器、標(biāo)志寄存器(即PSW寄存器)、通用寄存器組和EU控制器構(gòu)成。其任務(wù)是執(zhí)行指令,進(jìn)行全部算術(shù)邏輯運(yùn)算、完成偏移地址的計(jì)算,向總線接口單元BIU提供指令執(zhí)行結(jié)果的數(shù)據(jù)和訪問存儲器需要的偏移地址,并對通用寄存器和標(biāo)志寄存器進(jìn)行管理。
指令和程序的執(zhí)行過程如圖2.3所示。
除了了解8086CPU基本操作過程之外,討論CPU內(nèi)部結(jié)構(gòu)的重要目的是為匯編語言程序設(shè)計(jì)和輸入輸出接口的學(xué)習(xí)打下基礎(chǔ)。所以,我們重點(diǎn)討論CPU與程序設(shè)計(jì)有關(guān)的部分。下面討論的8086的寄存器結(jié)構(gòu)、存儲器組織、I/O組織和尋址方式將達(dá)到這個目的。圖2.38086CPU程序執(zhí)行過程
2.28086的寄存器結(jié)構(gòu)
8086CPU內(nèi)部具有14個16位寄存器,用于提供參與運(yùn)算的數(shù)據(jù),控制指令執(zhí)行和對指令及操作數(shù)尋址,其寄存器結(jié)構(gòu)如圖2.4所示。圖2.48086CPU的寄存器結(jié)構(gòu)2.2.1通用寄存器組
圖2.4中8個16位通用寄存器分為兩組:數(shù)據(jù)寄存器及地址指針和變址寄存器。
1.數(shù)據(jù)寄存器
數(shù)據(jù)寄存器包括AX、BX、CX和DX。在指令執(zhí)行過程中既可用來寄存操作數(shù),也可用于寄存操作的結(jié)果。它們中的每一個又可將高8位和低8位分成獨(dú)立的兩個8位寄存器來使用。16位數(shù)據(jù)寄存器主要用于存放數(shù)據(jù),也可以用來存放地址。而8位寄存器(AH、AL、BH、BL、CH、CL、DH和DL)只能用于存放數(shù)據(jù)。
2.地址指針和變址寄存器
地址指針和變址寄存器包括SP、BP、SI和DI。這組寄存器在功能上的共同點(diǎn)是,在對存儲器操作數(shù)尋址時,用于形成20位物理地址碼的組成部分。在任何情況下,它們都不能獨(dú)立地形成訪問內(nèi)存的地址碼,因?yàn)樗鼈兌贾挥?6位。訪問存儲器的地址碼由段地址(存放在段寄存器中)和段內(nèi)偏移地址兩部分構(gòu)成。而這4個寄存器用于存放段內(nèi)偏移地址的全部或一部分。后面我們將說明段寄存器和地址形成的方法。
SP(StackPointer)堆棧指針:用于存放堆棧操作(壓入、彈出,或入棧、出棧)地址的段內(nèi)偏移地址。其段地址由段寄存器SS提供。
BP(BasePointer)基址指針:用于在某些間接尋址方式中存放段內(nèi)偏移地址的一部分(后面討論尋址方式時將進(jìn)一步說明)。特別值得注意的是,凡包含有BP的尋址方式中,如果無特別說明,其段地址由段寄存器SS提供。就是說,該尋址方式是對堆棧區(qū)的存儲單元尋址的。
SI(SourceIndex)和DI(DestinationIndex)變址寄存器:用于在某些間接尋址方式中存放段內(nèi)偏移地址的全部或一部分。在字符串操作指令中,SI用作源變址寄存器;DI用作目的變址寄存器,用于存放目的區(qū)的偏移地址。這組寄存器主要用來存放地址,也可以存放數(shù)據(jù)。
以上8個16位通用寄存器在一般情況下都具有通用性,?從而提高了指令系統(tǒng)的靈活性。通用寄存器還各自具有特定的用法,有些指令中還隱含地使用這些寄存器。表2.1給出了通用寄存器的特定用法。表2.1通用寄存器的特定用法2.2.2段寄存器組
前面已經(jīng)指出,訪問存儲器的地址碼由段地址和段內(nèi)偏移地址兩部分組成。段寄存器用來存放段地址。總線接口單元BIU設(shè)置4個段寄存器。CPU可通過這4個段寄存器訪問存儲器中4個不同的段(每段64KB)。
1.代碼段寄存器
代碼段寄存器CS(CodeSegment)用于存放當(dāng)前執(zhí)行程序所在段的段地址。CS的內(nèi)容左移四位再加上指令指針I(yè)P的內(nèi)容就是下一條要執(zhí)行的指令地址。
2.數(shù)據(jù)段寄存器
數(shù)據(jù)段寄存器DS(DataSegment)用于存放當(dāng)前數(shù)據(jù)段的段地址。?通常數(shù)據(jù)段用來存放數(shù)據(jù)和變量。DS的內(nèi)容左移四位再加上按指令中存儲器尋址方式計(jì)算出來的偏移地址,即為對數(shù)據(jù)段指定單元進(jìn)行讀寫的地址。
3.堆棧段寄存器
堆棧段寄存器SS(StackSegment)用于存放當(dāng)前堆棧段的段地址。堆棧是存儲器中開辟的按后進(jìn)先出原則組織的一個特別存儲區(qū),主要用于調(diào)用子程序時,保留返回主程序的地址和保存進(jìn)入子程序?qū)⒁淖兤渲档募拇嫫鞯膬?nèi)容。對堆棧進(jìn)行操作(入?;虺鰲?的地址由SS的內(nèi)容左移四位加上SP的內(nèi)容得到。
4.附加段寄存器
附加段寄存器ES(ExtraSegment)用于存放附加段的段地址。附加段是一個附加數(shù)據(jù)段。附加段是在進(jìn)行字符串操作時作為目的區(qū)地址使用的。
DS和ES都要由用戶用程序設(shè)置初值。若DS和ES的初值相同,則數(shù)據(jù)段和附加段重合。2.2.3控制寄存器組
1.指令指針I(yè)P(InstructionPointer)
指令指針I(yè)P相當(dāng)于其它微處理器術(shù)語中的程序計(jì)數(shù)器PC。?它保存下一條要執(zhí)行的指令的偏移地址。在用戶程序中不能使用該寄存器,但可以用調(diào)試程序DEBUG中的命令改變其值,以改變程序執(zhí)行地址,用于調(diào)試程序。某些指令如轉(zhuǎn)移指令、過程調(diào)用指令和返回指令等可改變IP的內(nèi)容。
2.標(biāo)志寄存器(FLAG)
8086CPU含有一個兩字節(jié)的標(biāo)志寄存器,用于保存處理器狀態(tài)字PSW(ProcessorStatusWord)。已經(jīng)用了9個標(biāo)志位,其中,6個標(biāo)志位是反映前一次涉及ALU操作結(jié)果的狀態(tài)標(biāo)志,3個標(biāo)志位是控制CPU操作特征的控制標(biāo)志,如下所示:狀態(tài)標(biāo)志有:
CF(CarryFlag):進(jìn)位標(biāo)志。如果加法時最高位(對字節(jié)操作是D7位,對字操作是D15位)產(chǎn)生進(jìn)位或減法時最高位產(chǎn)生借位,則CF=1,否則CF=0。
PF(ParityFlag):?奇偶標(biāo)志。如果操作結(jié)果的低8位中含有偶數(shù)個1,則PF=1,否則PF=0。
AF(AuxiliaryCarryFlag):輔助進(jìn)位標(biāo)志。如果在加法時D3位有進(jìn)位或減法時D3位有借位,則AF=1,否則AF=0。這個標(biāo)志位用于實(shí)現(xiàn)BCD(即二進(jìn)制編碼的十進(jìn)制數(shù))碼算術(shù)運(yùn)算結(jié)果的調(diào)整。
ZF(ZeroFlag):零標(biāo)志。如果運(yùn)算結(jié)果各位都為零,則ZF=1,否則ZF=0。
SF(SignFlag):符號標(biāo)志。它總是和結(jié)果的最高位(字節(jié)操作時是D7位,字操作時是D15位)相同。因?yàn)樵谘a(bǔ)碼運(yùn)算時最高位是符號位,所以運(yùn)算結(jié)果為負(fù)時,SF=1,否則SF=0。
OF(OverflowFlag):溢出標(biāo)志。在加或減運(yùn)算中結(jié)果超出8位或16位有符號數(shù)所能表示的數(shù)值范圍(-128~+127或-32768~+32767)時,產(chǎn)生溢出,OF=1,否則OF=0。具體地講,對于加運(yùn)算,如果次高位(數(shù)值部分最高位)形成進(jìn)位加入最高位,而最高位(符號位)相加時(包括次高位的進(jìn)位)卻沒有進(jìn)位輸出,或者反過來,次高位沒有進(jìn)位加入最高位,但最高位卻有進(jìn)位輸出,都將發(fā)生溢出。因?yàn)檫@兩種情況分別是:兩正數(shù)相加,結(jié)果超出了范圍,形式上變成負(fù)數(shù);兩個負(fù)數(shù)相加,結(jié)果超出了范圍,形式上變成了正數(shù)。對于減運(yùn)算,當(dāng)次高位不需從最高位借位,但最高位卻需借位(正數(shù)減負(fù)數(shù),差超出范圍)時,或反過來,當(dāng)次高位需從最高位借位,但最高位不需借位(負(fù)數(shù)減正數(shù),差超出范圍)時,均會溢出。溢出和進(jìn)位是兩個性質(zhì)不同的標(biāo)志,千萬不能混淆。以上所述各狀態(tài)標(biāo)志位的置1置0條件是一般規(guī)則,各種指令對狀態(tài)標(biāo)志位的具體影響將在第3章介紹指令時予以說明。下面舉例說明加減運(yùn)算對狀態(tài)標(biāo)志的影響。
例如,假設(shè)前一條指令執(zhí)行加法:
那么,執(zhí)行完這條指令后各標(biāo)志是:SF=0,ZF=0,PF=0,AF=0,CF=0,OF=0。假如前一條指令執(zhí)行加法:
那么,執(zhí)行完這條指令后各標(biāo)志是:SF=1,ZF=0,PF=1,AF=1,CF=0,OF=1。
假如前一條指令執(zhí)行減法:
那么,執(zhí)行完這條指令后各標(biāo)志是:SF=0,ZF=0,PF=1,AF=0,CF=1,OF=0??刂茦?biāo)志有:
DF(DirectionFlag):方向標(biāo)志??捎弥噶铑A(yù)置。字符串操作指令執(zhí)行時受它的控制。當(dāng)DF=0時,執(zhí)行串操作指令,變址寄存器地址自動遞增;當(dāng)DF=1時,則變址寄存器地址自動遞減,即該標(biāo)志位可控制地址朝增大的方向或減小的方向改變。
IF(InterruptEnableFlag):中斷允許標(biāo)志。可用指令預(yù)置。當(dāng)IF=1時,CPU響應(yīng)可屏蔽中斷請求;若IF=0,則CPU不響應(yīng)可屏蔽中斷請求。
TF(TrapFlag):陷阱標(biāo)志。若TF=1,則CPU處于單步執(zhí)行指令工作方式。每執(zhí)行一條指令就自動產(chǎn)生一次類型1的內(nèi)部中斷。IBMPC系統(tǒng)中,用系統(tǒng)調(diào)試程序DEBUG時,T命令就是利用這種中斷。這種中斷服務(wù)子程序的功能是顯示所有寄存器的當(dāng)前值和將要執(zhí)行的下一條指令。 2.38086的存儲器組織
討論每一條指令的執(zhí)行和程序的運(yùn)行,都離不開CPU如何與存儲器之間傳輸信息的問題。所以必須討論8086是怎樣組織存儲器空間的。下面參照上節(jié)給出的圖2.2討論8086存儲器的基本組織方法。
2.3.1存儲器地址空間和數(shù)據(jù)存儲格式
8086的存儲器是以字節(jié)(Byte,8位,簡用B表示)為單位組織的。由于8086CPU具有20條地址總線,所以可尋址的存儲器地址空間容量為220B(約1MB)。每個字節(jié)對應(yīng)一個唯一的地址,地址范圍為0~220-1(用十六進(jìn)制表示為00000H~FFFFFH),如圖2.5所示。圖2.5存儲器的地址存儲器內(nèi)兩個連續(xù)的字節(jié)被定義為一個字。一個字中的每個字節(jié)都有一個字節(jié)地址,每一個字的低字節(jié)(低8位)存放在低地址中,高字節(jié)(高8位)存放在高地址中。字的地址指低字節(jié)的地址。各位的編號方法是最低位(LSB)為位0。一個字節(jié)中最高位(MSB)的編號為位7;一個字中最高位的編號為位15。這些約定如圖2.6所示。圖2.6地址和位號的約定
8086允許字從任何地址開始。字的地址為偶地址時,稱字的存儲是對準(zhǔn)的;若字的地址為奇地址,則稱字的存儲是未對準(zhǔn)的。
8086CPU數(shù)據(jù)總線有16位,對于訪問(讀或?qū)?字節(jié)(8位)的指令,需要一個總線周期,對于訪問一個偶地址的字(16位)的指令,也需要一個總線周期;而對于訪問一個奇地址的字的指令,則需要兩個總線周期(CPU自動完成)。2.3.2存儲器的分段和物理地址的形成
從前面的介紹可知,8086CPU地址總線有20條,存儲器地址空間為1MB。但CPU內(nèi)部可以提供地址的寄存器BX、IP、SP、BP、SI和DI及算術(shù)邏輯運(yùn)算單元ALU都是16位,只能直接提供16位地址,即尋址范圍為64KB。8086CPU巧妙地采用了地址分段方法,將尋址范圍擴(kuò)大到1MB。在8086中,把1MB的存儲器空間劃分成若干個邏輯段,每段最大的空間容量是64KB個存儲單元。各邏輯段的起始地址必須是能被16整除的地址,即段的起始地址的低4位二進(jìn)制碼必須是0。一個段的起始地址的高16位被稱為該段的段地址。顯然,在1MB的存儲器地址空間中,可以有216個段地址。任意相鄰的兩個段地址相距16個存儲單元。段內(nèi)一個存儲單元的地址,可用相對于段起始地址的偏移量來表示,這個偏移量稱為段內(nèi)偏移地址,也稱為有效地址EA。偏移地址也是16位的,所以,一個段最大可以包括一個64KB的存儲器空間。由于相鄰兩個段地址只相距16個單元,所以段與段是互相覆蓋的,如圖2.7所示。圖2.7存儲器段的覆蓋示意圖每個存儲單元都有一個物理地址。物理地址就是存儲單元的實(shí)際地址編碼。在CPU與存儲器之間進(jìn)行任何信息交換時,需利用物理地址來查找所需要訪問的存儲單元。邏輯地址由段地址和偏移地址兩部分組成。段地址和偏移地址都是無符號的16位二進(jìn)制數(shù),常用4位十六進(jìn)制數(shù)表示。邏輯地址也可以說是程序中表示的地址,在指令中存儲器地址總是給出段地址和偏移地址兩部分。
邏輯地址的表示格式為:段地址:偏移地址。例如8000:0100表示段地址為8000H,偏移地址為0100H。上述格式中的段地址有時用段寄存器代替。知道了邏輯地址,可以求出它對應(yīng)的物理地址:
物理地址?=?段地址?×10H?+?偏移地址
因此8000:0100的物理地址為80100H。
8086CPU中BIU單元的加法器Σ用來完成物理地址的計(jì)算,如圖2.8所示。圖2.8物理地址的形成在訪問存儲器時,段地址總是由段寄存器提供的。8086微處理器有4個段寄存器(CS、DS、SS、ES)。把段地址裝入段寄存器的那些段被稱作當(dāng)前段。顯然,當(dāng)前段不會超過4個。指令只能訪問當(dāng)前段,但用程序可以對段寄存器的內(nèi)容進(jìn)行修改,從而可實(shí)現(xiàn)訪問所有的段。2.3.3信息的分段存儲與段寄存器的關(guān)系
段寄存器的利用不僅使存儲器地址空間擴(kuò)大到1MB,而且為信息按功能分類分段存儲帶來了方便。存儲器中的信息可分為程序代碼、數(shù)據(jù)和計(jì)算機(jī)的狀態(tài)等類信息。為了操作方便,存儲器可相應(yīng)地劃分為:①程序區(qū),該區(qū)存儲程序的指令代碼;②數(shù)據(jù)區(qū),它存儲原始數(shù)據(jù)、中間結(jié)果和最后結(jié)果;③堆棧區(qū),用以存儲需要壓入堆棧的數(shù)據(jù)或狀態(tài)信息。段寄存器的分工是:代碼段寄存器CS劃定并控制著程序區(qū);數(shù)據(jù)段寄存器DS和附加段寄存器ES控制著數(shù)據(jù)區(qū);而堆棧段寄存器SS對應(yīng)著堆棧存儲區(qū)。表2.2列出了各種類型訪問存儲器時所要使用的段寄存器和段內(nèi)偏移地址的來源,它規(guī)定了為各種目的訪問存儲器時所形成的20位物理地址的原則。這個表的理解要點(diǎn)如下:表2.2各種類型訪問存儲器時的地址成分
(1)任何類型訪問存儲器時,其段地址要么由默認(rèn)段寄存器提供,要么由“指定”的段寄存器提供。所謂默認(rèn)段寄存器,是指在指令中不用專門的信息指定另外一個段寄存器的情況。這時就由默認(rèn)段寄存器提供訪問內(nèi)存的段地址。實(shí)際程序設(shè)計(jì)時,絕大多數(shù)屬于這種情況,因此用戶應(yīng)熟記各種類型訪問內(nèi)存時的段寄存器。
有幾種類型訪問存儲器時允許指定另外的段寄存器,這為訪問不同的存儲器段提供了靈活性。段寄存器的指定是靠在指令碼中增加一個字節(jié)的前綴碼實(shí)現(xiàn)的。有些類型訪問存儲器時不允許指定另外的段寄存器,它們是:為取指令碼訪問內(nèi)存時,段寄存器一定是CS;堆棧操作時,段寄存器一定是SS;字符串處理指令的目的地址,其段寄存器一定是ES。
(2)段寄存器DS、ES和SS的內(nèi)容是用傳送指令置入的,但任何傳送型指令不能向段寄存器CS中置入數(shù)。第3章將講到,ASSUME偽指令及JMP、CALL、RET、INT和IRET等指令可以設(shè)置和影響CS的內(nèi)容。更改段寄存器的內(nèi)容,將意味著存儲區(qū)的移動。這說明無論程序區(qū)、數(shù)據(jù)區(qū)還是堆棧區(qū),都可以不限于64KB的容量,都可以通過重置段寄存器內(nèi)容的方法予以擴(kuò)大,而且各存儲區(qū)都可以在存儲器中浮動。
(3)表中“段內(nèi)偏移地址來源”一欄指明,除了兩種類型訪問存儲器是“依尋址方式求得有效地址”外,其它都指明了一個16位的指針寄存器或變址寄存器。如取指令訪問內(nèi)存時,段內(nèi)偏移地址只能由指令指針I(yè)P提供;堆棧的壓入、彈出操作時,段內(nèi)偏移地址只能由SP提供;字符串操作時,源地址和目的地址中的段內(nèi)偏移地址分別由SI和DI提供。除此以外的為存取操作數(shù)而訪問內(nèi)存時,段內(nèi)偏移地址將由下節(jié)討論的指令碼規(guī)定的尋址方式求得。
在程序設(shè)計(jì)時,當(dāng)前段可容納64KB程序代碼、?64KB堆棧和128KB數(shù)據(jù),即共256KB。一般情況下,用不到這么多。若不用附加段,則ES和DS重合。圖2.9給出了這兩種典型分段法。圖2.9典型分段法(a)同時存取最大地址256KB;(b)段部分重疊、存取小地址
2.48086的I/O組織
由于外部設(shè)備的復(fù)雜性和多樣性,特別是通常運(yùn)行速度比CPU低,因此I/O設(shè)備不能直接和CPU直接相連接。I/O接口邏輯是保證信息和數(shù)據(jù)在CPU與I/O設(shè)備之間正常傳送的電路。從外部設(shè)備與CPU之間傳輸信息的角度出發(fā),任何外部設(shè)備都可以看做是一個或多個寄存器。CPU向外部設(shè)備輸出信息時看做向寄存器傳送數(shù)據(jù);外部設(shè)備向CPU輸入信息時看做從寄存器讀入數(shù)據(jù)。如圖2.2所示,每個能夠傳輸8位數(shù)據(jù)的通路稱為一個I/O端口,可以類比于存儲器的一個字節(jié)存儲單元。每個I/O端口有唯一的I/O地址與之對應(yīng)。
8086地址總線的低16位用來對8位I/O端口尋址,所以8086的I/O地址空間為65536,即可以訪問65536個8位I/O端口。雖然I/O地址線和存儲器地址線是共用的,但利用控制總線中的一些控制信號可以區(qū)分是I/O存取還是存儲器存取。任何兩個地址連續(xù)的8位I/O端口都可以當(dāng)作一個16位I/O端口,亦即類似于存儲器的字。對8086,也像存儲器的字那樣,每次要實(shí)現(xiàn)奇地址的16位I/O端口輸入輸出,都必須訪問兩次。
2.58086的尋址方式
機(jī)器語言指令由二進(jìn)制代碼組成。一條指令包含操作碼(OP)和操作數(shù)兩部分,操作碼指明該指令進(jìn)行什么操作,操作數(shù)指出該指令在執(zhí)行規(guī)定操作時所需的信息來源和歸宿。8086的指令通常使用一個操作數(shù)或兩個操作數(shù)。
規(guī)定操作數(shù)的方法,即指令中用于說明操作數(shù)地址的方法稱為尋址方式。8086的尋址方式分為兩類:數(shù)據(jù)尋址方式和轉(zhuǎn)移地址尋址方式。2.5.1數(shù)據(jù)尋址方式
1.立即(Immediate)尋址
當(dāng)數(shù)據(jù)為8位或16位時,可直接放在指令本身的最后一個字節(jié)(8位)或兩個字節(jié)(16位)中。這樣的數(shù)據(jù)常稱為立即操作數(shù)。
2.寄存器(Register)尋址
數(shù)據(jù)存放在指令規(guī)定的寄存器中。對于16位數(shù)據(jù),寄存器可以是AX、BX、CX、DX、SI、DI、SP或者BP。而對于8位數(shù)據(jù),寄存器可以是AL、AH、BL、BH、CL、CH、DL或DH。
3.直接(Direct)尋址
操作數(shù)在存儲單元中,其16位有效地址,即段內(nèi)偏移地址在指令碼之中,占兩個字節(jié)。
4.寄存器間接(RegisterIndirect)尋址
操作數(shù)在存儲單元中,其有效地址在指令碼指明的基址寄存器BX或變址寄存器SI或DI之中。有效地址可表示為
5.寄存器相對(RegisterRelative)尋址
操作數(shù)在存儲單元中,其有效地址是一個8位或16位的位移量(以后都用disp表示)與一個基址寄存器或變址寄存器的內(nèi)容之和。位移量disp和這個寄存器在指令碼中給出。其有效地址可表示為
6.基址變址(BasedIndexed)尋址
操作數(shù)在存儲單元中,其有效地址是一個基址寄存器和一個變址寄存器的內(nèi)容之和?;芳拇嫫骱妥冎芳拇嫫髟谥噶畲a中指明。其有效地址可表示為
7.基址變址且相對(RelativeBasedIndexed)尋址
操作數(shù)在存儲單元中,其有效地址是一個8位或16位的位移量disp、一個基址寄存器內(nèi)容和一個變址寄存器內(nèi)容三部分之和,即為
8.隱含(Implied)尋址
有些指令的指令碼中不包含指明操作數(shù)地址的部分,而其操作碼本身隱含地指明了操作數(shù)地址。字符串操作類指令就屬于這種尋址。
圖2.10以圖示方式給出了前7種尋址方式中確定操作數(shù)的方法。
需要指出,上述存儲器操作數(shù)尋址方式中,僅給出了有效地址EA,而段地址則由前面介紹過的表2.2給出。圖2.10與數(shù)據(jù)有關(guān)的尋址方式(a)立即方式;(b)直接方式;(c)寄存器方式;(d)寄存器間接方式;(e)寄存器相對方式;(f)基址變址方式;(g)基址變址且相對方式
例如,若(BX)=0158H,(DI)=10A5H,位移量=1B57H,(DS)=2100H,(SS)=1100H,(BP)=0100H,段寄存器按默認(rèn)段寄存器,則相對于各種尋址方式的有效地址和物理地址將是:
(1)直接尋址:
EA?=?1B57H
物理地址?=?21000H?+?1B57H?=?22B57H
(2)寄存器間接尋址(假設(shè)寄存器為BX):
EA?=
0158H
物理地址?=
21000H?+
0158H?=
21158H
(3)寄存器相對尋址(假設(shè)寄存器為BP):
EA?=?0100H?+?1B57H?=?1C57H
物理地址?=?11000H?+?1C57H?=?12C57H
(4)基址變址尋址(假設(shè)寄存器為BX和DI):
EA?=?0158H?+?10A5H?=?11FDH
物理地址?=?21000H?+?11FDH?=?221FDH
(5)基址變址且相對尋址(假設(shè)寄存器為BP和DI):
EA?=?0100H?+?10A5H?+?1B57H?=?2CFCH
物理地址?=?11000H?+?2CFCH?=?13CFCH2.5.2轉(zhuǎn)移地址的尋址方式
在2.1節(jié)中,我們介紹了CPU執(zhí)行指令的過程,指令是按程序排定的順序存放在存儲器中的。8086由于采用存儲器分段的方法把尋址范圍擴(kuò)大為1MB,因而程序的執(zhí)行順序是由代碼段寄存器CS和指令指針I(yè)P的內(nèi)容決定的。正常情況下,每當(dāng)BIU完成一條取指周期之后,就自動改變指令指針I(yè)P的內(nèi)容,使之指向下一條指令。這樣,就使程序按預(yù)先安排的順序依次執(zhí)行。但當(dāng)程序執(zhí)行到某一特定位置時,根據(jù)程序設(shè)計(jì)的要求,需要脫離程序的正常執(zhí)行順序,而把它轉(zhuǎn)移到指定的指令地址。這種轉(zhuǎn)移是在程序轉(zhuǎn)移類指令的控制下實(shí)現(xiàn)的。程序轉(zhuǎn)移指令通過改變IP和CS的內(nèi)容,就可以改變程序的正常執(zhí)行順序。轉(zhuǎn)移地址尋址方式有以下4種。
1.段內(nèi)直接尋址
在段內(nèi)直接尋址方式中,指令碼中包括一個位移量disp,轉(zhuǎn)移的有效地址為(IP)+disp。因?yàn)槲灰屏渴窍鄬τ诋?dāng)前IP的內(nèi)容來計(jì)算的,所以又稱為相對尋址。disp可以是16位,也可以是8位。如果disp為8位,則稱為段內(nèi)短程轉(zhuǎn)移。無論是8位還是16位,disp在指令碼中都是用補(bǔ)碼表示的有正負(fù)符號的數(shù)。
2.段內(nèi)間接尋址
在段內(nèi)間接尋址方式中,在同一代碼段內(nèi),要轉(zhuǎn)移到的地址的16位段內(nèi)偏移地址(即有效地址)在一個16位寄存器中或在存儲器相鄰兩個單元中。?這個寄存器或相鄰兩個單元的第一個單元的地址,是在指令碼中以上面討論的數(shù)據(jù)的尋址方式給出的。只不過尋址方式?jīng)Q定的地址里存放的不是一般的操作數(shù)而是轉(zhuǎn)移地址。
3.段間直接尋址
在段間直接尋址方式中,指令碼中直接給出16位的段地址和16位的有效地址。
4.段間間接尋址
段間間接尋址與段內(nèi)間接尋址相似,但不可能有寄存器間接尋址,因?yàn)橐玫降霓D(zhuǎn)移地址為32位(16位段地址和16位有效地址)。?指令中一定給出某種訪問內(nèi)存單元的尋址方式。用這種尋址方式計(jì)算出的存儲單元地址開始的連續(xù)4個單元的內(nèi)容就是要轉(zhuǎn)移的地址,其中前兩個單元內(nèi)的16位值為有效地址,后兩個單元內(nèi)的16位值為段地址。
屬于轉(zhuǎn)移類指令的有轉(zhuǎn)子程序指令CALL、無條件轉(zhuǎn)移指令JMP和多種條件轉(zhuǎn)移指令等。并不是每種指令都具有上述4種尋址方式。各種轉(zhuǎn)移指令有哪些尋址方式,將在第3章結(jié)合指令功能予以說明。
2.6高檔微處理器的寄存器結(jié)構(gòu)
和存儲器組織簡介
與8086相比,80286以上至奔騰系列高檔微處理器的內(nèi)部結(jié)構(gòu)要復(fù)雜得多,這些內(nèi)容不可能在一門課程中詳細(xì)敘述。下面,以已經(jīng)獲得的8086內(nèi)部結(jié)構(gòu)的知識為基礎(chǔ),用相比較的方法,簡單介紹高檔微處理器內(nèi)部的寄存器結(jié)構(gòu)和存儲器組織。高檔微處理器內(nèi)部的寄存器結(jié)構(gòu)和存儲器組織,除了使高檔微處理器具有更強(qiáng)的數(shù)據(jù)處理能力之外,重要一點(diǎn)是高檔微處理器支持像Windows這樣的多任務(wù)操作系統(tǒng)。高檔微處理器所具有的大軟件(字節(jié)多)運(yùn)行、多任務(wù)運(yùn)行、組織大容量的虛擬存儲器等高級功能,要求其CPU內(nèi)部有相應(yīng)的邏輯電路支持。
2.6.1高檔微處理器的寄存器結(jié)構(gòu)
圖2.11是奔騰等高檔微處理器中程序可見的寄存器結(jié)構(gòu)。圖2.11高檔微處理器的寄存器結(jié)構(gòu)圖2.11中,把圖2.4的8086通用寄存器對比地畫在一起??梢钥偨Y(jié)出以下幾點(diǎn):
(1)?8個通用寄存器的長度擴(kuò)展為32位,寄存器的名字之前增加了字符E。前4個寄存器(EAX、EBX、ECX、EDX)中的每一個在編程時可按位數(shù)不同分離為4個可以獨(dú)立使用的寄存器。以第1個為例,寄存器AL是指32位中的位0~位7,寄存器AH是指32位中的位8~位15,寄存器AX是指32位中的位0~位15,而寄存器EAX則指32位的全部。
這四個寄存器擴(kuò)展為32位,提供了32位數(shù)據(jù)運(yùn)算和操作基礎(chǔ),將大大提高數(shù)據(jù)處理能力,使微處理器提升為32位微處理器。與此相似,SI、DI、BP和SP是指32位的低16位部分,分別擴(kuò)展成的ESI、EDI、EBP和ESP為32位的全部。
(2)指令指針EIP為32位寄存器,存放下一條要執(zhí)行指令的地址的偏移值,這個偏移值總是相對于代碼段的基地址值而言的。EIP的低16位稱為IP,用于偏移值為16位的情況(實(shí)模式,后面說明)。
EIP和ESI、EDI、EBP、ESP都擴(kuò)展為32位之后,它們訪問存儲器提供的段內(nèi)偏移地址擴(kuò)展為32位,自然也就大大擴(kuò)展了可以訪問的存儲器空間。下節(jié)還將進(jìn)一步討論。
(3)標(biāo)志寄存器也從8086的標(biāo)志寄存器(FLAGS)16位擴(kuò)展為32位,稱為EFLAGS。其中包括CF、PF、AF、ZF、SF、TF、IF、DF、OF狀態(tài)標(biāo)志和控制標(biāo)志位。此外,還定義了一些新的狀態(tài)標(biāo)志和控制標(biāo)志,是高檔微處理器特有的。
(4)段寄存器增加為6個,除原來的CS、DS、ES和SS外,增加了FS和GS段寄存器,也是用于定義數(shù)據(jù)段。它們都是16位。
2.6.2高檔微處理器的訪問存儲器機(jī)制
第1章已講述過,奔騰微處理器可以訪問存儲器空間位4GB。采用虛擬存儲技術(shù),還可以大大擴(kuò)展存儲空間。下面介紹微處理器是以怎樣的硬件邏輯支持這一功能的。
1.實(shí)模式與保護(hù)模式
80286及以上的高檔微處理器都可以工作于實(shí)模式(RealMode)或保護(hù)模式(ProtectedMode),而8086只能工作于實(shí)模式。實(shí)模式下微處理器只能訪問地址低端的1MB存儲器空間,即使奔騰微處理器也是如此。地址低端的1MB存儲區(qū)稱為實(shí)模式存儲器(RealModeMemory)、常規(guī)內(nèi)存(ConventionalMemory)或DOS存儲器系統(tǒng)。DOS要求處理器工作于實(shí)模式,而且各種微處理器在任何情況下每次加電或復(fù)位后都默認(rèn)以實(shí)模式開始。
Windows工作于保護(hù)模式。只有保護(hù)模式才允許訪問低端的1MB存儲區(qū)和高于1MB以上的存儲區(qū)。
2.保護(hù)模式下的存儲器尋址機(jī)制
保護(hù)模式下訪問存儲器的地址仍由兩部分合成,即偏移地址和基地址。其基地址不再直接是段寄存器保存的段地址,而是由段寄存器和對應(yīng)的描述符寄存器聯(lián)合提供的。圖2.12給出段寄存器與對應(yīng)的描述符寄存器關(guān)系。
保護(hù)模式下的段寄存器保存的不再是段地址,而是提供找到段地址的選擇符(Selector,翻譯為“符”源于“or”)。與選擇符密切相關(guān)的概念是段描述符(Descriptor)、描述符表和描述符寄存器。圖2.12段寄存器和描述符寄存器
1)段描述符
段描述符是對段進(jìn)行說明的固定格式的連續(xù)8個字節(jié)信息。其中,包括32位的段地址,這里稱為基地址(BaseAddress);20位的段界限(SegmentLimit);其余12位是屬性位(用作標(biāo)志位和控制位),這放在第9章討論。基地址就是段的開始地址,?32位意味著4GB存儲空間的任何一個單元地址都可以被指定為段的開始。段的界限指明該段的最大偏移量,即段的長度或段內(nèi)的容量。段的界限為20位,220=1M,意味著段的最大偏移量可以為1MB。顯然,一個段的描述符的基地址和段界限就定義了這個段的地址范圍。例如基地址為00F00000H,段界限為000FFH,則這個段始于00F00000H,結(jié)束于00F000FFH。這是控制位G(在其余12位的屬性位中)為0時的段范圍計(jì)算方法;如果G位設(shè)定為1,段的范圍還要大。
2)描述符表和描述符索引號
描述符表是在存儲器中定義的用于存儲描述符的特殊用途的段。有三種描述符表:全局描述符表GDT(1個)、局部描述符表LDT(多個)和中斷描述符表IDT(1個)。每個表最多存放8192(213)個描述符,每個描述符8個字節(jié),所以每個表占用存儲器空間為64KB。每個描述符在描述符表中的地址是用索引號經(jīng)換算得到的。每個描述符分配一個13位的索引號(0~8191),索引號乘以8得到這個描述符在描述符表中的開始地址。
描述符表作為特殊用途的段也有描述符。
3)段寄存器、選擇符和描述符寄存器
如圖2.12所示,6個16位段寄存器中的每一個都對應(yīng)有一個64位描述符寄存器。段寄存器由程序置入段選擇符。16位選擇符中的13位是指明該段的描述符在描述符表中地址的索引號。而且,從操作上,一旦程序向某個段寄存器置入段選擇符,將自動地把描述符表中被選定的64位描述符傳入對應(yīng)的描述符寄存器。?描述符寄存器是與段寄存器“共生的”,但卻不能用指令讀寫內(nèi)容,是程序不可見的。存有描述符表的特殊用途的段,它的描述符存于與描述符寄存器結(jié)構(gòu)相似的描述符表寄存器(GDTR、LDTR和IDTR),也是程序不可見的。至此,對保護(hù)模式下存儲器的訪問可以做以下簡單總結(jié):
(1)保護(hù)模式下訪問存儲器的地址仍由段基地址和偏移地址兩部分組成。段基地址和偏移地址都是32位。
(2)段的基地址不是段寄存器直接提供的,而是首先經(jīng)過段寄存器中的選擇符中的索引號,指明存儲于段描述符表中的描述符,然后由這個描述符提供的。正是這種“間接提供”基地址方法,使得可尋址空間幾乎可以無限擴(kuò)大,因?yàn)橹灰?/p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電纜保護(hù)管施工方案
- 庫房硬化地坪施工方案
- 2025年度福建省勞動合同制員工社會保險及福利待遇合同
- 2025年度電商平臺會員購物返利協(xié)議
- 2025年度海鮮電商平臺運(yùn)營合作協(xié)議
- 二零二五年度農(nóng)村土地流轉(zhuǎn)及農(nóng)業(yè)項(xiàng)目投資合同
- 二零二五年度社會保險經(jīng)辦機(jī)構(gòu)與金融機(jī)構(gòu)合作協(xié)議
- 樁基合同-2025年度樁基施工項(xiàng)目管理與咨詢服務(wù)協(xié)議
- 二零二五年度煤炭供應(yīng)鏈金融服務(wù)協(xié)議
- 二零二五年度住房公積金購房合同原件遺失風(fēng)險預(yù)防及應(yīng)急處理合同
- (小升初真題)六年級數(shù)學(xué)簡便計(jì)算(易錯題、難題)一【含答案】
- 三菱變頻器d700使用手冊應(yīng)用篇
- 學(xué)校安全隱患網(wǎng)格化管理平臺系統(tǒng)操作手冊
- 表面粗糙度等級對照表模板.doc
- GMP講課教案簡述
- 新冀人版小學(xué)科學(xué)三年級下冊全冊教案(2022年春修訂)
- 東莞虎門架空線路拆除施工方案
- 尿液結(jié)晶教學(xué)課件
- 繪本《你很特別》
- 茶葉揉捻機(jī)總體設(shè)計(jì)方案的擬定
- 蘇州大學(xué)應(yīng)用技術(shù)學(xué)院財(cái)務(wù)管理
評論
0/150
提交評論