&2.3 8086的寄存器結(jié)構(gòu)
本節(jié)概述:
8086微處理器共有14個16位寄存器,為了便于描述,現(xiàn)把這些寄存器分成四類:4個數(shù)據(jù)寄存器、4個指針與變址寄存器,4個段寄存器,以及一個指令指針寄存器和一個標志寄存器,如圖2-3所示。

教學(xué)目標:
掌握各類寄存器的用法,掌握它們的指令隱含用法的操作。
學(xué)習(xí)內(nèi)容:
數(shù)據(jù)寄存器
指針與變址寄存器
段寄存器
指令指針與標志寄存器
§2.3.1 數(shù)據(jù)寄存器(AX、BX、CX、DX)
這4個16位的通用寄存器通常是指令系統(tǒng)用來執(zhí)行算術(shù)和邏輯運算操作的。這些寄存器還可以當作8個8位寄存器,供指令系統(tǒng)在字節(jié)操作時使用。處理器執(zhí)行操作時,經(jīng)常要用數(shù)據(jù)寄存器暫存操作數(shù)或中間結(jié)果,訪問它要比訪問存儲器快,有了這樣一個快速存取數(shù)的地方,就可縮短處理器執(zhí)行的時間。
當作為16位數(shù)據(jù)寄存器使用時,4個數(shù)據(jù)寄存器命名分別為AX、BX、CX、DX。而作為8位寄存器使用時,分別命名為AH、AL,BH、BL,CH、CL,DH、DL。在8086CPU中,只有這4個數(shù)據(jù)寄存器中的每一個可以當作兩個8位寄存器使用,其他寄存器只能作為一個完整的16位寄存器使用。
§2.3.2 指針(SP、BP)與變址寄存器(SI、DI)
表2-1

程序執(zhí)行過程中,要經(jīng)常訪問存在存儲器中的操作數(shù),所以指令要指出存儲單元地址,為了縮短指令代碼長度,一般不采用指令中直接給出地址方法,而將地址放在專用寄存器中(寄存器給出編碼),修改寄存器內(nèi)容來達到修改地址目的。這種能存放指令操作數(shù)地址的寄存器稱為指針與變址寄存器。
這4個16位的寄存器主要用來產(chǎn)生有效的存儲器地址,或?qū)嶋H地址的偏移量。這些寄存器只能當作16位的寄存器來尋址。除產(chǎn)生有效的存儲器地址外,這些寄存器還可供指令系統(tǒng)執(zhí)行算術(shù)和邏輯操作。
在8086的指令系統(tǒng)中,不是所有寄存器都能被每條指令指定的。在許多情況下,指令只能使用一個特定的寄存器或寄存器組去執(zhí)行它的功能。對于執(zhí)行特定操作的8086指令,寄存器有一個隱含的用法,如下表2-1所示。該表列舉了寄存器隱含特定用法的指令操作。
§2.3.3 段寄存器(CS、DS、ES、SS)
在8086CPU中,有地址線20根,它可尋址存儲空間1MB。而8086指令給出的地址編碼只有16位,指令指針(IP)和變址寄存器(SI、DI)也是16位的。16位地址的尋址空間為64K。為次,要將1MB空間分為如干個段,每段64KB,指令可對特定段進行訪問。所以在8086中有4個16位的段寄存器,它們用來識別當前可尋址的4個段:CS識別當前的代碼段,DS識別當前的數(shù)據(jù)段,SS識別當前的堆棧段,而ES則識別當前的附加段。
一條指令指定了一個段內(nèi)偏移量,并且段寄存器指定了可供使用的4個段,而選擇哪一段則依賴于這些便移量是如何被使用的。一個便移量可能指定下一條執(zhí)行的指令是一個操作數(shù)。所有指令都是從前的代碼段中取出的,因此就需要一個含有下一條執(zhí)行的指令在當前代碼段中的偏移量的寄存器,這個寄存器就是IP。取操作數(shù)段,一般可以用在指令前放一字節(jié)前綴的方法來指定,這個前綴指定從4個段中的哪一個段中取操作數(shù),如果沒有這樣一個前綴(一般情況),操作數(shù)取自當前的數(shù)據(jù)段,除非偏移地址是從一個指針指示器的內(nèi)容中計算得到的,在這種情況下,使用當前的堆棧段。若操作數(shù)是一條串指令的目的操作數(shù),則使用當前的附加段。
§2.3.4 指令指針寄存器(IP)和標志寄存器
IP中的值等于下一條指令相對于當前代碼段基地址的偏移量,它與CS一起構(gòu)成下一條指令的實際地址。IP的值由總線接口單元BIU自動修改,程序不能直接訪問它。
標志寄存器是一個16位的寄存器,只使用其中9位,其中6位作為狀態(tài)位,反映了指令的操作結(jié)果。其他3位作為控制位,用于制CPU的行為。
§2.4 8086的存儲器組織
本節(jié)概述
本節(jié)介紹8086的存儲器組織,包括存儲器的段結(jié)構(gòu),物理地址的形成方式,以及8086CPU的存儲器結(jié)構(gòu)。通過本節(jié)的學(xué)習(xí),你能掌握有關(guān)8086存儲器的構(gòu)成,應(yīng)用等知識。對8086CPU的組成有更深的理解。
本節(jié)內(nèi)容
1.存儲器的段結(jié)構(gòu)
2.物理地址的產(chǎn)生
3.8086CPU的存儲器接口
§2.4.1 存儲器的段結(jié)構(gòu)

8086CPU有20條地址總線,能直接訪問1MB(220=1MB)的存儲空間,其物理地址的范圍是00000~FFFFFH。
8086CPU內(nèi)部的寄存器都是16位的,如IP、SP、BP、DI、SI等。這些寄存器對地址的運算當然就是16位的,而16位地址值的尋址范圍是64KB(216=64KB),因此,把1MB存儲器空間分為16個64KB的段,用段寄存器(CS、DS、ES、SS)標識當前使用的段,用16位寄存器(如IP、SP、BP、DI、SI等)的值標識相對于當前段基地址的偏移量,如圖2-4所示。
如何用段寄存器標識當前使用的段?
用段寄存器的值(16位)表示一個段的基地址高16位,而段的基地址低4位固定為0000B,從而可以標識當前使用的段。
"段地址:偏移量"這種表示方法稱為"邏輯地址",其對應(yīng)的具體存儲器單元的地址稱為"物理地址",如圖2-5所示。
程序的段結(jié)構(gòu):

程序由指令(又稱代碼)、數(shù)據(jù)、堆棧構(gòu)成,它們有不同的性質(zhì)和作用。指令控制CPU完成需要的操作,如加、減、乘、除等運算,數(shù)據(jù)是被操作的對象或操作的結(jié)果,堆棧用于臨時保存一些數(shù)據(jù)、地址或CPU狀態(tài)。一般說來,指令、數(shù)據(jù)、堆棧分別放在存儲器的不同段中,如圖2-6所示。
§2.4.2 物理地址的產(chǎn)生
在程序設(shè)計中,為了方便,一般采用邏輯地址(16位段值:16位偏移量)。CPU根據(jù)邏輯地址找出存儲器的物理地址(20位)。CPU計算物理地址的方法是:把段寄存器中的16位段值左移4位,加上偏移量,構(gòu)成20位物理地址,如圖2-7所示。

物理地址的計算是由CPU的總線接口單元BIU自動完成的,BIU自動選擇某個段寄存器進行計算。
取指令時,BIU選擇CS,把CS的值左移4位,加上IP提供的16位偏移量,構(gòu)成指令的20位物理地址。
讀寫數(shù)據(jù)時,BIU選擇DS或ES,把DS/ES的值左移4位,加上尋址方式提供的16位偏移量,構(gòu)成數(shù)據(jù)的20位物理地址。
堆棧操作時,BIU選擇SS,把SS的值左移4位,加上SP提供的16位偏移量,構(gòu)成堆棧的20位物理地址。
§2.4.3 8086CPU的存儲器接口
在物理連接上,8086CPU把1MB存儲空間分為兩個512KB的存儲體(Bank):偶數(shù)地址存儲體和奇數(shù)地址存儲體。偶數(shù)地址存儲體的數(shù)據(jù)線與CPU數(shù)據(jù)總線低8位(D7~D0)相連,奇數(shù)地址存儲體的數(shù)據(jù)線與CPU數(shù)據(jù)總線高8位(D15~D8)相連。用地址A0和信號BHE區(qū)分兩個存儲體。
表2-2 存儲體的選擇

地址線A19~A1同時連到兩個存儲體上,A0=0時選中偶數(shù)地址存儲體,BHE=0時選中奇數(shù)地址存儲體,如圖2-8所示。

由于8086CPU有16位數(shù)據(jù)總線,它與存儲器之間,一次傳送既可以同時傳送兩個字節(jié)數(shù)據(jù),也可以單獨傳送一個字節(jié)數(shù)據(jù),傳送情況見表2-2所示。
對于8088CPU,只有8位數(shù)據(jù)總線,它與存儲器之間,一次傳送只能傳送一個字節(jié)數(shù)據(jù)。
