- 微計算機原理及應用
- 潘名蓮 王傳丹 龐曉鳳編著
- 18755字
- 2018-12-28 18:42:45
2.2 8086微處理器
2.2.1 8086的內部結構
8086 CPU內部由兩個獨立的工作部件,即執行部件(EU,Execution Unit)和總線接口部件(BIU,Bus Interface Unit)構成,其內部結構框圖如圖2-1所示,左半部為EU,右半部為BIU。

圖2-1 8086 CPU內部結構框圖
1.執行部件(EU)
EU只負責執行指令,而不與外部總線打交道。EU執行的指令從BIU的指令隊列緩沖器取得,執行指令所得結果或執行指令所需的數據由EU向BIU發出請求,由BIU向存儲器或外部設備存入或讀取。EU包含下列三大部分。
(1)運算器
運算器由下列部分組成,負責所有運算。除此之外,通用寄存器也將協助其工作。
① 16位算術邏輯單元ALU(Arithmetic Logic Unit),其核心是一個二進制加法器,完成兩方面的任務:
- 進行所有的算術/邏輯運算。
- 按指令尋址方式計算尋址單元16位的偏移地址EA(Effect Address),并將此EA送到BIU中形成一個20位的實際地址PA(Physical Address),以對1MB的存儲空間尋址。
② 16位的狀態標志寄存器F(Flag),用來存放反映ALU運算結果的特征狀態,或存放一些控制標志。
③ 暫存寄存器,協助ALU完成各種運算,對參加運算的數據進行暫存。
(2)通用寄存器組
通用寄存器組包括8個16位的寄存器,其中AX,BX,CX,DX為數據寄存器,既可以寄存16位數據,也可分成兩半,分別寄存8位數據;SP(Stack Pointer)為堆棧指針,用于堆棧操作時,確定堆棧在內存中的位置,給出棧頂的偏移量(Offset);BP(Base Pointer)為基址指針,用來存放位于堆棧段中的一個數據區基址的偏移量;SI(Source Index)和DI(Destination Index)為變址寄存器,SI用來存放源操作數地址的偏移量,DI用來存放目的操作數地址的偏移量。所謂偏移量是相對于段起始地址(或稱為段首址)的距離。
(3)EU控制單元
EU控制單元接收從BIU指令隊列(Instruction Stream Queue)中送來的指令碼,并經過譯碼,形成完成該指令所需的各種控制信號,控制EU的各個部件在規定時間完成規定的操作。EU中所有的寄存器和數據通路(Q總線除外)都是16位的,可實現16位數據的快速傳送和處理。
2.總線接口部件(BIU)
BIU是和總線打交道的接口部件,根據EU的請求,執行8086 CPU對存儲器或I/O接口的總線操作,完成其數據傳送。BIU由下列幾部分組成。
(1)指令隊列緩沖器
該緩沖器是用來暫存指令的一組暫存單元,由6個8位的寄存器組成,最多可存入6字節的指令碼,采用“先進先出”原則,按順序存放,順序被取到EU中去執行。其工作將遵循以下原則。
① 取指時,將取來的指令存入指令隊列緩沖器,當緩沖器中存入一條指令時,EU就開始執行。
② 指令隊列緩沖器中只要有1字節為空,BIU便自動執行取指操作,直到填滿為止。
③ 在EU執行指令過程中,若需要對存儲器或I/O接口進行數據存取,則BIU將在執行完現行取指的總線周期后的下一個總線周期,對指定的存儲單元或I/O接口進行存取操作,交換的數據經BIU交EU進行處理。
④ 當EU執行轉移、調用和返回指令完畢時,將清除指令隊列緩沖器,并要求BIU從新的地址重新開始取指令,新取的第一條指令將直接送EU執行,隨后取來的指令填入指令隊列。
由于執行部件EU和總線接口部件BIU是兩個獨立的工作部件,它們可按并行方式重疊操作,在EU執行指令的同時,BIU也在進行取指令、讀操作數或存入結果的操作。這樣,提高了整個系統的執行速度,充分利用總線實現最大限度的信息傳輸。與8位微處理器相比,這是一個很大的改進。
(2)16位指令指針寄存器IP(Instruction Pointer)
其功能與8位微處理器的程序計數器PC功能相似。但由于8086取指令和執行指令同時進行,因此Intel公司改用指令指針IP這一名稱代替8位機的程序計數器PC的稱法。IP中總是保存著EU要執行的下一條指令的偏移地址,而不像8位機的PC總是保存下一條取指令的地址。IP不能直接由程序進行存取,但可以進行修改,其修改發生在下列情況下:
① 程序運行中自動修正,使之指向要執行的下條指令的偏移地址。
② 轉移、調用、中斷和返回指令能改變IP的值,并將原IP值入棧保存,或由堆棧恢復原值。
(3)地址產生器和段寄存器
由于存放地址信號的IP和通用寄存器都只有16位,其編址范圍只能達到64K,只為8086訪存空間1M范圍中的一個段,因此必須設置產生20位實際地址PA的機構,8086采用了地址產生器∑。
段寄存器是用來存放每種段的首地址的。8086有4個段寄存器:代碼段CS(Code Segment)寄存器,數據段DS(Data Segment)寄存器,堆棧段SS(Stack Segment)寄存器和附加段ES(Extra Segment)寄存器,分別用來存放代碼段首址、數據段首址、堆棧段首址和附加段首址。圖2-2示出實際地址PA產生的過程。例如,要產生執行指令的PA,就將IP中的16位指令指針與代碼段寄存器CS左移4位后的內容在地址產生器∑中相加。又例如,要產生某一操作數的PA,則應該首先由ALU計算出該操作數的16位偏移地址EA,然后在∑中與數據段寄存器DS左移4位后的內容相加。其余兩個段————堆棧段和附加段中數據的PA也由同樣的方法產生。概括起來,PA的計算公式為
PA=(段首址*16)+偏移地址
其中的偏移地址和段首址又都稱為邏輯地址。

圖2-2 實際地址PA的產生過程
(4)總線控制邏輯
8086的引腳線比較緊張,只分配20條總線用來傳送16位數據信號D0~D15、20位地址信號A0~A19和4位狀態信號S3~S6,這就必須采用分時傳送。總線控制邏輯的功能,就是根據指令進行操作,用邏輯控制的方法實現上述信號的分時共用總線。分時傳送的情況可參見本章2.2.7節總線操作時序。
2.2.2 8086的寄存器結構
在了解8086 CPU的內部結構以后,可以仿照第1章的典型微處理器來分析8086執行指令的過程。但是,對從事微計算機應用來說,在了解內部結構的基礎上,更應掌握從中提取出的一種更簡化的結構。這種結構中只包含信息寄存的空間,即程序中出現的寄存器。這種簡化結構又稱為可編程的寄存器結構,或程序設計的概念模型。

圖2-3 8086的寄存器結構
圖2-3為8086 CPU的寄存器結構,包括13個16位的寄存器和1個16位的狀態標志寄存器。這里,著重指出每個寄存器的用途,以便在指令中更恰當地使用它們。
寄存器按功能可分為以下幾組。
1.通用寄存器組
8086 CPU中設置了較多的通用寄存器,是一種面向寄存器的體系結構,操作數據可以直接存放在這些寄存器中,因而可減少訪問存儲器的次數,使用寄存器的指令長度也較短。這樣,既提高了數據處理速度,也減小指令存放的內存空間。
8086的通用寄存器分為以下兩組。
(1)數據寄存器
數據寄存器是指EU中的4個16位寄存器:AX,BX,CX和DX,一般用來存放16位的數據,又可分成高字節H和低字節L,即AH,BH,CH,DH和AL,BL,CL,DL兩組,用于存放8位的數據。它們均可獨立尋址,獨立地出現在指令中。數據寄存器主要用來存放操作數或中間結果,以減少訪問存儲器的次數。
多數情況下,數據寄存器被用在算術或邏輯運算指令中進行算術邏輯運算。在有些指令中,則有特定的隱含用途,如AX作為累加器(Accumulator);BX作為基址(Base)寄存器,在查表轉換指令XLAT中存放表的首址;CX作為計數(Count)寄存器,控制循環;DX作為數據(Data)寄存器,如在字除法運算指令DIV中存放余數。這些寄存器在指令中的隱含使用歸納如表2-2所示。
表2-2 數據寄存器的隱含使用

(2)指針和變址寄存器
8086有SP、BP兩個指針寄存器和SI、DI兩個變址寄存器。一般用來存放地址的偏移量,且被送到BIU的地址產生器Σ中與段寄存器內容的16倍數相加,產生20位的實際地址PA。
SP和BP都用來指示位于當前堆棧段中數據的偏移地址,但它們在使用上又有區別。SP指示入棧指令(PUSH)和出棧指令(POP)操作時棧頂的偏移地址,故稱為堆棧指針寄存器;BP指示存放于堆棧段中的一個數據區基址的偏移地址,故稱為基址指針寄存器。
SI和DI用來存放當前數據段中數據的偏移地址。SI中存放源操作數地址的偏移量,故稱為源變址寄存器;DI中存放目的操作數地址的偏移量,故稱為目的變址寄存器。例如,用于數據串操作指令中,被處理的源數據串的偏移地址放入SI,而處理后得到的結果數據串的偏移地址則放入DI。
2.段寄存器
段寄存器用來存放段首地址,因而可把8086的1MB存儲空間分成若干個邏輯段。8086 CPU運行一匯編語言程序,通常需要用到4個現行段:代碼段是存放程序的代碼的,數據段是存放程序當前使用的數據的,堆棧段是為入棧、出棧數據提供存放空間的,附加段通常也是用來存放數據的,其典型用法是存放處理后的結果數據。這4個段的首址分別由4個段寄存器CS,DS,SS和ES來存放。它們都是16位的寄存器。
3.狀態標志寄存器F
8086 CPU的狀態標志寄存器F是一個16位寄存器,用了其中的9個位作為標志位(狀態標志位為6個,控制標志位為3個),如圖2-4所示。

圖2-4 8086的狀態標志寄存器
(1)狀態標志位
狀態標志位用來反映EU執行算術或邏輯運算后其結果的狀態,共6個狀態標志。
① 進位標志CF(Carry Flag):若CF=1,則表示結果的最高位上產生了一個進位或借位;若CF=0,則無進位或借位產生。
② 輔助進位標志AF(Auxiliary Carry Flag):當AF=1,表示結果的低4位產生了一個進位或借位;若AF=0,則無此進位或借位。
③ 溢出標志OF(Overflow Flag):當OF=1,表示帶符號數在算術運算后產生了算術溢出;若OF=0,則無溢出。
④ 零標志ZF(Zero Flag):當ZF=1,表示運算結果為零;若ZF=0,則結果不為零。
⑤ 符號標志SF(Sign Flag):當SF=1,表示帶符號數的運算結果為負數,即結果的最高位為1;若SF=0,則結果為正數,最高位為0。
⑥ 奇偶標志PF(Parity Flag):當PF=1,表示運算結果中有偶數個1;若PF=0,則結果中有奇數個1。
(2)控制標志位
控制標志位是用來控制CPU操作的,由指令設置或清除,有以下3個控制標志。
① 方向標志DF(Direction Flag):用來控制數據串操作指令的步進方向。用STD指令將DF置1后,數據串指令將以地址的遞減順序對數據串進行處理;若用CLD指令清除DF,則數據串指令將以地址的遞增順序對數據串進行處理。
② 中斷允許標志IF(Interrupt Enable Flag):若用指令STI將IF置1,則8086 CPU開啟中斷,即允許接受外部從INTR引腳發來的中斷請求;若用指令CLI將IF清除,則表示關中斷,不能接受經INTR發來的中斷請求。必須注意,IF的設置不影響非屏蔽中斷NMI請求,也不影響CPU響應內部產生的中斷請求。
③ 陷阱標志TF(Trap Flag):8086為使程序調試方便設置了TP。若置TP為1,則8086進入單步工作狀態。在這種方式下,每執行完一條指令,就自動地產生一個內部中斷,轉去執行一個中斷服務程序,將每條指令執行后CPU內部寄存器的情況顯示出來,以便檢查程序;反之,當TF被清除,8086仍正常地執行程序。
標志位的狀態可用調試程序DEBUG將它們顯示出來,所表示的符號如表2-3所示。
表2-3 FLAGS中標志位的狀態表示符號

4.指令指針寄存器IP
IP是一個16位的寄存器,存放EU要執行的下一條指令的偏移地址。當BIU從代碼段取出指令字節后,IP自動加1,又指向下一條指令的偏移地址,以實現對代碼段指令的跟蹤。IP的內容僅當執行轉移類指令時才會由轉移地址改變。
2.2.3 8086的引腳特性
8086 CPU的外殼仍采用8位微處理器所用的40條引腳的雙列直插(DIP)封裝,如圖2-5所示。由于16位的CPU的數據總線增加到16條,地址總線增加到20條,因此必須分時復用一些引腳,表示為AD0~AD15。還有一些引腳將根據8086工作的方式不同,體現不同的功能,功能的轉換由33號引腳進行控制。當
(高電平)時,8086工作于最小方式MN,24~31號引腳直接提供8086的控制總線信號,如圖中括號外的信號;當
時,24~31號引腳提供的信號如圖中括號內所示,這些信號還需經外接的8228總線控制器轉換,才能提供給系統作為控制總線信號使用。
8086的引腳按其特性分為以下5類。

圖2-5 8086 CPU芯片引腳特性
1.地址/數據總線(AD15~AD0雙向、三態)
這是地址和數據信號復用的一類總線。每當訪問存儲器或I/O接口時,首先用來發地址信號,然后用來傳輸數據。因此,先發的地址信號應由外接的地址鎖存器鎖存下來,才能保證使用的需要。當進行存儲器直接存取(DMA)時,這類總線處于浮空狀態。
2.地址/狀態總線(A19/S6,A18/S5,A17/S4,A16/S3輸出、三態)
A19~A16是地址信號的高4位,和A15~A0一樣,也是應該首先發出的;S6~S3是狀態信號,可在輸出地址信號之后輸出,因此,這4條總線也可采取分時復用。A19~A16在訪問存儲器時才有用,也需由外接地址鎖存器進行鎖存后,向系統提供20位地址信號,而訪問I/O接口時,則不使用,即A19~A16=0。4位狀態信號有不同的用途:① S4,S3用來指示當前使用哪一個段寄存器:00指示在使用ES,01指示在使用SS;10指示在使用CS;11指示在使用DS。② S5用來指示中斷允許標志IF的狀態。③ S6始終保持低電平。
當進行DMA時,這類總線進入浮空狀態。
3.控制總線
以下8條控制線不論8086工作在最大或是最小方式下,都是存在的。
(1)
高8位數據總線允許/狀態線(輸出,三態)。這是分時復用線。在訪問存儲器或I/O接口的總線周期中,首先輸出控制信號,用以對以字節組織的存儲器或I/O接口實現高位或低位字節的選擇;然后輸出狀態信號S7。S7為備用狀態信號,其內容不固定。
(2)
讀控制信號(輸出,三態,低電平有效)。當時,表示8086 CPU執行存儲器讀操作或I/O讀操作;DMA時,浮空。
(3)READY
準備就緒信號(輸入,高電平有效)。該信號是由所訪問的存儲器或I/O接口發來的響應信號。當READY為高電平時,表示內存或I/O設備準備就緒,馬上可進行一次數據傳輸。在每個總線周期中CPU都要對READY信號進行采樣,若檢測到為無效的低電平時,將自動插入等待狀態TW,直到READY變為高電平后才進行數據傳輸,結束該次總線周期。
(4)
測試信號(輸入,低電平有效)。該信號和等待指令WAIT結合起來使用。在CPU執行WAIT指令時,進入空轉的等待狀態;每隔5個時鐘周期對引腳進行一次測試。當8086的
信號為有效電平時,等待狀態結束,繼續往下執行WAIT后面的指令。等待期中允許外部中斷,中斷返回后到WAIT指令的下一條命令。
(5)INTR
可屏蔽中斷請求信號(輸入,高電平有效)。當INTR引腳出現高電平時,表示外設提出了中斷請求,8086在每一個指令周期的最后一個狀態去采樣此信號。若已發來此信號,而且CPU的中斷允許標志IF=1(開中斷),則CPU就會在結束當前指令后,響應此中斷請求,轉去執行一個中斷服務程序;相反,雖已發來此請求,但IF=0(關中斷),則CPU不會響應中斷,表示外設中斷請求被屏蔽掉了。
(6)NMI
非屏蔽中斷請求信號(輸入,上升沿有效)與INTR有兩點不同:
① 該請求信號是一個上升沿觸發信號,而不是高電平信號。
② 只要此請求信號來到,不管IF是否為1,CPU都會在執行完當前指令后,進入規定中斷類型號的非屏蔽中斷處理程序。
(7)RESET
復位信號(輸入,高電平有效)用來對CPU進行復位操作。8086 CPU要求復位信號至少維持4個時鐘周期的高電平才有效。復位信號有效后,CPU結束當前操作,并將CPU內部寄存器F,IP,DS,SS,ES及指令隊列緩沖器清零,而將CS設置為FFFFH。當復位信號變為低電平時,CPU便從FFFF0H開始執行程序,執行系統的啟動操作。
(8)CLK
時鐘脈沖(輸入)。8086 CPU要求時鐘脈沖的占空比為1/3,即1/3周期為高電平,2/3周期為低電平。通常,8086的時鐘信號由外接的時鐘發生器8284A提供。
4.電源和地址
電源線VCC接入的電壓為+5V±10%;8086有兩條地線GND,均應接地。
5.其他控制線
8086 CPU的24~31號引腳也是一些控制信號線,但它們的定義將根據8086的工作方式(最小工作模式或最大工作模式)來確定,將在本章2.2.5節介紹。
2.2.4 8086的時鐘和總線周期概念
8086 CPU由外接的一片時鐘發生器8284A提供主頻為5MHz的時鐘信號。在時鐘控制下,一步步順序地執行指令,因此時鐘周期是CPU執行指令的時間刻度。在執行指令過程中,凡需訪問存儲器或訪問I/O接口的操作都統一交給BIU的外部總線完成,每次訪問稱為一個總線周期。若執行數據輸出,則稱為“寫”總線周期;若執行數據輸入,則稱為“讀”總線周期。
前面2.2.1節和2.2.2節涉及的是信息流通途徑和存放的空間概念,本節涉及的則是信息處理的時間概念。
1.8284A時鐘信號發生器
8284A是Intel公司專為8086設計的時鐘發生器,產生8086所需的系統時鐘信號(即主頻),用石英晶體或某一TTL脈沖發生器作為振蕩源,除提供頻率恒定的時鐘信號外,還要對外界輸入的“準備就緒”信號RDY和復位信號RES進行同步。8284A的引腳特性及其與8086/8088 CPU的連接如圖2-6所示。外界的RDY輸入8284A,經時鐘的下降沿同步后,輸出READY信號作為8086的“準備就緒”信號;同樣,外界的復位信號輸入8284A,經整形并由時鐘的下降沿同步后,輸出RESET信號作為8086的復位信號(其寬度不得小于4個時鐘周期)。外界的RDY和
可以在任何時候發出,但送到CPU去的都是經過時鐘同步了的信號。
8284A根據使用振蕩源的不同,有兩種不同的連接方法。
(1)用脈沖發生器做振蕩源時,只要將該發生器的輸出端與8284A的EFI端相連即可。
(2)更常用的方法是采用晶體振蕩器作為振蕩源,這時需將晶體振蕩器的兩端接到8284A的X1和X2上。

圖2-6 8284A及其與8086/8088的連接
如果用前一種方法,則必須將接高電平,而用后一種方法,則必須將
接地。不管用哪種方法,8284A輸出的時鐘CLK的頻率均為振蕩源頻率的1/3,而振蕩源本身的頻率經8284A驅動后,由OSC端輸出,可供系統使用。
2.總線周期
CPU訪問(讀或寫)一次存儲器或I/O接口所花的時間,稱為一個總線周期。8086的一個最基本的總線周期由4個時鐘周期組成。時鐘周期是CPU的基本時間計量單位,由主頻決定。例如,8086的主頻為5MHz,一個時鐘周期就是200ns。一個時鐘周期又稱為一個狀態T,因此一個基本總線周期就由T1,T2,T3,T4組成。圖2-7為典型的BIU總線周期波形圖。在T1狀態,CPU首先將應訪問的存儲單元或I/O端口的地址送到總線上;在T2~T4狀態,若是“寫”總線周期,則CPU把輸出數據送到總線上;若是“讀”總線周期,則CPU在T3到T4期間從總線上輸入數據,T2狀態時總線浮空,以便CPU有個緩沖時間把輸出地址的寫方式轉換為輸入數據的讀方式。這就是總線AD0~AD15和A16/S3~A19/S6在總線周期的不同狀態下傳送不同信號用的分時復用總線的方法。在表示CPU總線周期波形圖時,對于由兩條或兩條以上的線組成的一組總線的波形(如地址總線、數據總線等),使用交叉變化的雙線表示,這是因為在每個狀態下,有的線可能為低電平,有的線則可能為高電平。這里還需要指出兩點:

圖2-7 典型的BIU總線周期波形圖
(1)當與CPU相連的存儲器或外設速度跟不上CPU的訪問速度時,就會由存儲器或外設通過READY控制線,在T3狀態開始之前向CPU發一個READY無效信號,表示傳送的數據未準備就緒,于是CPU將在T3之后插入一個或多個附加的時鐘周期TW(即等待狀態)。在TW狀態,總線上的信息情況維持T3狀態的信息情況。當存儲器或外設準備就緒時,就向READY線上發出有效信號,CPU接到此信號,自動脫離TW而進入T4狀態。
(2)總線周期只用于CPU和存儲器或I/O接口之間傳送數據和供取指令填充指令隊列。如果在一個總線周期之后,不立即執行下一個總線周期,那么系統總線就處于空閑狀態,即執行空閑(Idle)周期TI。在TI中,可以包含1個時鐘周期或多個時鐘周期。這期間,在總線的高4位上CPU仍然保持前一個總線周期的狀態信息;而在總線低16位上,則視前一個總線周期是寫周期還是讀周期來確定。若是寫周期,則總線低16位上繼續保持數據信息;若是讀周期,則CPU將使低16位處于浮空狀態。
2.2.5 8086的工作模式
8086 CPU有兩種工作模式:最小工作模式和最大工作模式,以盡可能適應各種應用場合的需要。
1.最小工作模式及8282、8286的應用
(1)最小工作模式
當把8086的33腳接向+5V時,就處于最小工作模式。所謂最小工作模式,就是系統中只有一個微處理器8086,所有的總線控制信號都直接由8086產生,系統中總線控制邏輯電路被減到最少。最小工作模式適合于較小規模的應用,其系統結構如圖2-8所示,這與8位微處理器系統類似,總線上的芯片可根據用戶需要接入。圖中的8284A為時鐘發生器,外接晶體的基本振蕩頻率為15MHz,經三分頻后,作為CPU的系統時鐘CLK。

圖2-8 8086最小工作模式典型系統結構
(2)8282/8283的應用
8282/8283是Intel公司的8位帶鎖存器的單向三態不反相/反相的緩沖器,用來鎖存8086訪問存儲器和I/O接口時于T1狀態發出的地址信號。經8282鎖存后的地址信號可以在整個周期保持不變,為外部提供穩定的地址信號。
8282/8283均采用20條引腳的DIP封裝,其內部邏輯結構和引腳特性如圖2-9所示。為三態控制信號,低電平有效。STB為鎖存選通信號,高電平有效。接入系統時,以8086的ALE(地址鎖存允許信號)作為STB。ALE信號在每個總線周期一開始就有效,使8086的地址信號被鎖存下來,并傳至輸出端,作為系統地址總線,供存儲器芯片和I/O接口芯片連接。在不帶DMA控制器的8086單處理器系統中,可將
接地,保持常有效,而當
為高電平時,8282的輸出端則處于高阻狀態。

圖2-9 8282及8283的內部邏輯及引腳特性
(3)8286/8287的應用
8286/8287是Intel公司的8位雙向三態不反相/反相的緩沖器,均采用20條引腳的DIP封裝,其內部邏輯結構和引腳特性如圖2-10所示。每一位雙向三態緩沖器由兩個單向三態緩沖器構成,起雙向電子開關作用,可對數據總線進行功率放大,并當收/發器使用。8286/8287可作為選件,用于需要增加數據總線驅動能力的系統。

圖2-10 8286及8287的內部邏輯及引腳特性
和T是該緩沖器的三態控制信號,經過兩個或非門產生對正向及反向緩沖器的門控信號。
為允許輸出控制信號,低電平有效;T為傳送方向控制信號,高電平有效。當
無效時,不管T是否有效,數據在兩個方向上都不能傳輸;只有當
時,若T=1,則數據從A流向B,若T=0,數據則由B流向A。8286/8287接入系統時,用8086的DEN(數據有效)信號作為
,用
(數據發/收)信號作為T。
(4)最小工作模式下24~31號引腳功能的定義
① (Memory/Input and Output)存儲器/輸入和輸出控制信號(輸出,三態):此信號被接至存儲器芯片和接口芯片的
片選端,用于區分CPU當前是訪問存儲器還是訪問接口。若為高電平,則表示CPU和存儲器進行數據交換;若為低電平,則表示CPU和輸入/輸出設備進行數據交換;當DMA時,此線被置為浮空。
② 寫控制信號(輸出,低電平有效,三態):當CPU執行對存儲器或對I/O的寫操作時,此信號有效。有效時間為寫周期中的T2,T3和TW,在DMA時,此線被置為浮空。
③ HOLD(HOLD Request)總線保持請求信號(輸入,高電平有效):是由系統中的其他總線主控部件(如DMA控制器)向CPU發來的請求占用總線的控制信號。當CPU收到此信號時,若CPU允許讓出總線,就在當前總線周期完成時,于T4狀態或空閑狀態TI的下一狀態從HLDA線上發出一個應答信號作為HOLD請求的響應,同時,CPU使具有三態功能的所有地址/數據總線和控制總線處于浮空,其時序如圖2-11所示。當總線請求部件收到HLDA后,獲得對總線的控制權。從這時開始,HOLD和HLDA都保持高電平(有效)。當請求部件完成對總線的占用后(如DMA完成),將把HOLD信號變為低電平(無效),CPU收到后,也將HLDA變為低電平(無效),至此,CPU又恢復對地址/數據總線和控制總線的控制權。
④ HLDA(HOLD Acknowledge)總線保持應答信號(輸出,高電平有效):這是與HOLD配合使用的,由CPU向總線請求部件發回的一種響應聯絡信號。
⑤ (Interrupt Acknowledge)中斷響應信號(輸出,低電平有效):是和中斷請求信號INTR配合使用的一對信號。此信號是在CPU收到外部中斷源發來的INTR后,且當中斷允許標志IF=1,則會在一條指令執行完畢的當前總線周期和下一個總線周期中,從
引腳上往外設接口各發一個負脈沖,以作為對外設中斷請求發回的響應。這兩個負脈沖都將從每個總線周期的T2維持到T4狀態的開始。如圖2-12所示,第1個負脈沖通知外設接口(如中斷控制器),它發出的中斷請求已經得到允許;第2個負脈沖期間,由外設接口往數據總線上送中斷類型碼n,使CPU能獲得有關中斷響應的有關信息。

圖2-11 總線保持請求/保持響應時序(最小模式)

圖2-12 8086的中斷響應信號及時序
⑥ ALE(Address Latch Enable)地址鎖存允許信號(輸出,高電平有效):在任何一個總線周期的T1狀態,ALE輸出有效電平,以表示當前在地址/數據復用總線上輸出的是地址信號。該信號提供給地址鎖存器8282/8283作為地址鎖存信號,對地址進行鎖存。要注意,此信號線不能被浮空。
⑦ (Data Enable)數據允許信號(輸出,低電平有效,三態):這是8086提供給數據總線收發器8286/8287的三態控制信號,接至其
端。此信號在每個訪問存儲器或I/O的周期或中斷響應周期有效;在DMA時,被置為浮空。
⑧ (Data Transmit/Receive)數據收/發控制信號(輸出,三態):在使用8286/8287作為數據總線收發器時,該信號用來控制8286/8287的數據傳送方向。若
為高電平,則進行數據發送,否則進行數據接收。在DMA時,被置為浮空。
2.最大工作模式及8288的應用
(1)最大工作模式
當把8086的33腳接地時,系統就處于最大工作模式。用于中型或大型規模的8086系統中。最大工作模式系統的顯著特點是可包含兩個或兩個以上的處理器,其中必有一個為主處理器8086,其他的稱為協處理器,用來協助主處理器承擔某方面的工作,使主處理器的性能得到橫向提升。8086系列的協處理器常用的有兩種:一種是專用于數值運算的處理器8087,它能實現多種類型的數值操作,如高精度整數和浮點運算、超越函數(如三角函數、對數函數等)的運算。用硬件完成運算比通常用軟件方法完成運算將大幅提高系統數值的運算速度;另一種是專用于輸入/輸出處理的協處理器8089,有一套專用于輸入/輸出操作的指令系統,直接供輸入/輸出設備使用,使8086從這類繁雜的工作中解脫出來,明顯地提高主處理器的效率。
8086最大工作模式的典型系統結構如圖2-13所示,與最小工作模式比較,一是增加了總線控制器8288,使總線控制功能和驅動能力得到增強,二是8286收發器為必選件,以適應系統組件增加對數據總線提出的功率要求。如果典型系統中加入總線仲裁器8289,就可構成一個多處理器系統,如圖2-14所示。

圖2-13 8086最大工作模式典型系統結構
最大工作模式下,許多總線控制信號是通過總線控制器8288產生的,而不是由8086 CPU直接提供。這樣,8086在最小工作模式下對24~31號引腳定義的控制功能就需重新定義,改為支持多處理器系統所用。
(2)最大工作模式下24~31號引腳功能的定義
最大工作模式下,對24~31號引腳定義的功能已示于圖2-5的括號中,包括下述控制信號:

圖2-14 多處理器系統
① ,
,
(Bus Cycle Status)總線周期的狀態信號(輸出,三態):用來指示CPU總線周期的操作類型,并送到8288總線控制器,產生對應于各種總線周期的控制命令如表2-4所示。
② QS1,QS0(Instruction Queue Status)指令隊列狀態信號(輸出,高電平有效):這兩個信號組合起來提供了前一個時鐘周期(指總線周期的前一個狀態)中指令隊列的狀態,以便于外部對8086 BIU中的指令隊列的動作跟蹤。QS1,QS0的代碼組合分別為00,01,10和11,所對應的指令隊列為:無操作、從隊列緩沖器取出指令的第一字節、隊列為空和從隊列緩沖器中取出第二字節以后部分。
表2-4 與總線周期,8288的控制命令

③ ,
(Request/Grant)總線請求輸入/總線請求允許輸出信號(雙向,低電平有效):在圖2-14的多處理器系統中,當8086使用總線,其
為高電平;這時,若協處理器8087或8089要使用總線,就由它們的
線輸出低電平(請求);經8086檢測,且當總線處于允許狀態,則8086的
輸出低電平作為允許信號(允許),再經8087或8089檢測出此信號,對總線進行使用;待使用完畢,將
線變為低電平(釋放),8086在檢測到該信號時,又恢復對總線的使用。
④ 總線封鎖信號(輸出,三態,低電平有效):當此信號線上輸出有效電平時,表示CPU獨占總線,封鎖其他總線主部件占用總線。
信號由指令前綴LOCK產生,LOCK前綴后面的一條指令執行完后,便撤銷了
信號(為避免多個處理器使用共有資源產生沖突而設置的)。此外,在8086的2個中斷響應脈沖之間,LOCK信號也自動有效,以防其他總線主部件在中斷響應過程中占有總線而使一個完整的中斷響應過程被間斷。在DMA下,LOCK引腳處于浮空。
(3)總線控制器8288
8288是20條引腳的DIP芯片,采用TTL工藝,其內部原理框圖及外部引腳如圖2-15所示。

圖2-15 8288的內部原理框圖和外部引腳
8288的引腳信號分為3組:輸入信號(含狀態和控制信號)、命令輸出信號、輸出的總線控制信號。
8288與系統的連接如圖2-16所示。從圖中可以看到,8288接收8086執行指令時產生的狀態信號、
、
,在時鐘發生器8284A的時鐘CLK信號控制下,譯碼產生時序性的各種總線控制信號和命令信號,同時,也增強這些信號對總線的驅動能力。盡管最大方式一般用于多處理器系統,然而,在一些單處理器系統中,由于此優點,也使用了8288。

圖2-16 8288總線控制器與系統的連接
8288的IOB(I/O總線工作方式)信號是用來決定其本身工作方式的,即:
① 當IOB接地時,8288工作在適合于單處理器工作的方式。這時IBM PC/XT微機為一般情況下設置的狀態。此時,要求(Address Enable)接地(有效),CEN(Command Enable)接+5V(有效),這種方式下的輸出端
(Master Cascade Enable/Peripheral Data Enable)輸出為MCE(主模塊允許)信號。
② 當IOB接+5V時,且CEN也接+5V(有效),8288將適合工作于多處理器的系統中。這種方式下,引腳輸出的是
(外部設備數據允許)信號,此信號用做8286收/發器的開啟信號,使局部總線和系統總線接通。
8288根據,
,
狀態信號譯碼后,產生以下控制信號和命令:
〈1〉ALE地址鎖存信號:和最小模式下的ALE含義相同,也是送給地址鎖存器8282作為選通信號STB。
〈2〉DEN數據允許信號和數據收/發信號:送到8286總線收/發器分別控制總線收/發器的開啟和控制數據的傳輸方向。這兩個信號和最小模式下的
和
含義相同,但是,這里的DEN和最小方式的
電平相反。
〈3〉中斷響應信號,與最小模式下的
含義相同。
〈4〉(Memory ReaD Command),
(Memory WriTe Command)和
(I/O Read Command),
(I/O Write Command)存儲器和I/O接口讀/寫控制信號:分別用來控制存儲器和I/O接口的讀/寫,均為低電平有效,都在相應總線周期的中間部分輸出。顯然,在任何一種總線周期內,只要這4個命令信號中有一個輸出,就可控制一個部件的讀/寫操作。這些信號相當于最小模式下,由8086直接產生的
、
和
配合作用的效果。
〈5〉(Advanced I/O Write Command)和
(Advanced Memory Write Command),超前寫I/O命令和超前寫內存命令:其功能與
,
相同,只是將超前一個時鐘周期發出,用來控制速度較慢的外設或存儲器芯片時,將得到一個額外的時鐘周期去執行寫操作。
2.2.6 8086的總線操作時序
8086 CPU執行訪問存儲器或訪問I/O接口的指令,或裝填指令隊列,都需要執行一個總線周期,進行總線操作。從前面已知,一個基本總線周期包含4個狀態T1,T2,T3,T4。當存儲器或I/O設備的速度較慢時,要通過8284A時鐘發生器發出READY=0(未準備就緒)信號,CPU則在T3開始時對READY進行采樣。當采到“未準備就緒”信號時,就會在T3之后插入1個或多個等待狀態TW。
CPU在每個狀態中都安排了具體的操作,如由總線發地址、狀態或控制信號,由總線收/發數據信號等。總線操作按數據信號傳輸方向可分為總線讀操作和總線寫操作。前者指CPU從存儲器或I/O接口讀取數據,后者指CPU把數據寫入到存儲器或I/O接口。讀/寫操作又與8086 CPU工作模式有關。現以8086的最小模式為例,分析總線讀/寫的操作時序。
1.8086最小模式下的總線讀操作時序
圖2-17為8086 CPU從存儲器或I/O接口讀取數據的操作時序。
(1)T1狀態
① CPU根據執行的是訪問存儲器還是訪問I/O接口的指令,首先在線上發有效電平。若為高電平,則表示從存儲器讀;若為低電平,則表示從I/O端口讀。此信號將持續整個總線周期。
② 從地址/數據復用線AD15~AD0和地址/狀態復用線A19/S6~A16/S3發存儲器單元地址(20位)或發I/O端口地址(16位)信號。這類信號只持續T1狀態,因此必須進行鎖存,以供整個總線周期使用。
③ 為了鎖存地址信號,CPU于T1狀態,從ALE引腳上輸出一個正脈沖作為8282地址鎖存器的地址鎖存信號。在ALE的下降沿到來之前,和地址信號均已有效。因此,8282可用ALE信號的下降沿對地址進行鎖存。

圖2-17 8086總線讀操作時序(最小模式)
④ 為了實現對存儲體的高位字節庫(即奇地址庫)的尋址,CPU在T1狀態通過引腳發
有效信號(低電平)。
和地址信號A0分別用來對奇、偶地址庫進行尋址(詳見本章2.2.7節存儲器組織)。
⑤ 為了控制數據總線的傳輸方向,發信號,以控制數據總線收/發器8286處于接收數據狀態。
(2)T2狀態
① 總線上輸出的地址信號消失,此時,AD15~AD0進入浮空狀態,作為一個緩沖期以便將總線傳輸方向由輸出地址轉為讀入數據。
② A19/S6~A16/S3及線開始輸出狀態信號S7~S3,并持續到T4狀態。其中的S7未賦實際意義。
③ 信號變為低電平(有效),用來開放總線收/發器8286。這樣,就可以使8286提前于T3狀態(即數據總線上出現輸入數據前)獲得開放,
有效信號維持到T4的中期結束。
④ 信號變為低電平(有效)。此信號被接到系統中所有存儲器和I/O接口芯片,用來開放數據輸出緩沖器,以便將數據送上數據總線。
⑤ 繼續保持低電平,維持8286為接收數據狀態。
(3)T3狀態
經過T1,T2后,存儲器單元或I/O接口把數據送上數據總線AD15~AD0,供CPU讀取。
(4)TW等待狀態
當系統中所用的存儲器或外設的工作速度較慢,不能在基本總線周期規定的4個狀態完成讀操作時,它們將通過8284時鐘發生器給CPU發一個READY為無效的信號。CPU在T3的前沿(下降沿)采樣READY。當采到的READY=0(未準備就緒)時,就會在T3和T4之間插入等待狀態TW。TW可以為1個或多個狀態。以后,CPU在每個TW的前沿(下降沿)去采樣READY,直至采到READY=1(表示“已準備就緒”)時,才在本TW結束時,脫離TW而進入T4狀態。在最后一個TW,數據已出現在數據總線上,因此,這時的總線操作和基本總線周期中T3狀態下的一樣。而在這之前的TW狀態,雖然所有CPU控制信號狀態已和T3狀態下的一樣,但終因READY沿未有效,仍不能使數據信號送上數據總線。
(5)T4狀態
在T4狀態和前一狀態交界的下降沿處,CPU對數據總線上的數據進行采樣,完成讀取數據的操作。
歸結起來:在總線讀操作周期中,8086于T1從分時復用的地址/數據線AD和地址/狀態線上輸出地址;T2時使AD線浮空,并輸出,
;在T3,T4時,外界將欲讀入的數據送至AD線上;在T4的前沿,將此數據讀入CPU。
2.8086最小模式下的總線寫操作時序
圖2-18示出8086 CPU對存儲器或I/O接口寫入數據的寫操作時序。與讀操作一樣,基本寫操作周期也包含4個狀態:T1,T2,T3和T4。當存儲器芯片或外設速度較慢時,在T3和T4之間插入1個或多個TW。

圖2-18 8086總線寫操作時序(最小工作模式)
在總線寫操作周期中,8086于T1將地址信號送至地址/數據復用總線AD上,并于T2開始直到T4,將數據信號輸出到AD線上,等到存儲器或I/O接口芯片上的輸入數據緩沖器被打開,便將AD線上輸出的數據寫入到存儲器單元或I/O端口。存儲器或I/O端口的輸入數據緩沖器是利用在T2狀態由CPU發出的寫控制信號打開的。
總線的寫周期和讀周期比較,有以下不同:
① 寫周期下,AD線上因輸出的地址和輸出的數據為同一方向,因此T2時不再需要像讀周期時要維持一個狀態的浮空以作為緩沖。
② 對存儲器或I/O接口芯片發的控制信號是,而不是
(但它們出現的時間類似,都從T2開始)。
③ 在引腳上發出的是高電平的數據發送控制信號DT,而不是
;DT被送到8286總線收/發器控制數據輸出方向。
2.2.7 存儲器組織
1.存儲器的標準結構
存儲器通常按字節組織排列成一個個單元,每個單元用一個唯一的地址碼表示,這就是存儲器的標準結構。若存放的數據為8位的字節數據,則將它們按順序進行存放;若存放的數據為16位的字數據,則將字的高位字節存于高地址單元,低位字節存于低地址單元;若存放的數據為32位的雙字(這通常是指地址指針數據),則將地址指針的偏移量(字)存于低地址的字單元中,將地址指針的段基址(字)存于高地址的字單元中,其存放的示意圖如圖2-19所示。還要注意:存放字時,其低位字節可從奇數地址開始,也可從偶數地址開始;前一種存儲方式稱為非規則存放(這樣存放的字為非規則字),后一種方式為規則存放(這樣存放的字為規則字)。對規則字的存取可在一個總線周期完成,對非規則字的存取則需兩個總線周期才能完成。
8086 CPU在組織1MB的存儲器時,其空間實際上被分成兩個512KB的存儲體,或稱存儲庫,分別叫做高位庫和低位庫。高位庫與8086數據總線中的D15~D8相連,庫中每個單元的地址均為奇數;低位庫與數據總線中的D7~D0相連,庫中每個單元的地址均為偶數。地址線A0和控制線用于庫的選擇,分別接到每個庫的選擇端
。地址線A19~A1同時接到兩個庫的存儲芯片上,以尋址每個存儲單元。存儲器高位庫、低位庫與總線的連接如圖2-20所示。當
時,選中奇數地址的高位庫;當A0=0時,選中偶數地址的低位庫。可見,當執行對各種數據尋址的指令時發出的
和A0信號就可控制對兩個庫的“讀”或“寫”操作;當
和A0分別為00,01,10和11時,實現的“讀”或“寫”分別為16位數據(雙庫),奇地址高位庫,偶地址低位庫,不傳送。

圖2-19 各種數據在存儲器中的存放

圖2-20 8086存儲器高、低位庫與總線的連接
2.存儲器分段
8086用20位地址信號,尋址1MB的內存空間,每個單元的實際地址PA需用5位十六進制數表示。但CPU內部存放地址信息的一些寄存器,如指令指針IP、堆棧指針SP、基址指針BP、變址寄存器SI,DI和段寄存器CS,DS,ES,SS等都只有16位,顯然不能存放PA而直接尋址1MB空間。為此,在16位或16位以上的微處理器中引入存儲器分段的概念。
分段就是把1MB空間分為若干邏輯段,每段最多可含64KB的連續存儲單元。每個段的首地址是一個能被16整除的數(即最后4位為0),首址是用軟件設置的。
運行一個程序所用的具體存儲空間可以為一個邏輯段,也可為多個邏輯段。段和段之間可以是連續的、斷開的、部分重疊的或完全重疊的,如圖2-21所示。
存儲器采用分段編址方法進行組織,帶來的好處如下。
① 指令中只涉及16位的地址(段首址或在段中的偏移量),縮短了指令長度,從而提高了執行程序的速度。
② 盡管存儲空間多達1MB,但程序執行過程中不需要在1MB的大空間中去尋址,多數情況下只需在一個較小的段中運行。
③ 多數指令的運行都不涉及段寄存器的值,而只涉及16位的偏移量,為此,分段組織存儲也為程序的浮動裝配創造了條件。
④ 程序設計者不用為程序裝配在何處而去修改指令,統一由操作系統去管理就行了。
3.實際地址和邏輯地址
實際地址,或稱物理地址,是指CPU和存儲器進行數據交換時使用的地址。對8086來說,是用20位二進制數或5位十六進制數表示的地址碼,是唯一能代表存儲空間每個單元的地址。
邏輯地址是指產生實際地址用到的兩個地址分量:段首址和偏移量,它們都是用無符號的16位二進制數或4位十六進制數表示的地址代碼。
指令中不能使用實際地址,只使用邏輯地址。由邏輯地址產生和計算實際地址的過程和公式已示于本章2.2.1節。注意:一個存儲單元只有唯一編碼的實際地址,而一個實際地址可對應多個邏輯地址,如圖2-22所示。如圖中某一實際地址11245H,可以從兩部分重疊的段中得到:在段首址為1123H的段中,其偏移量為15H;在段首址為1124H的段中,其偏移地址為05H。這兩組邏輯地址可表示為:1123H∶0015H和1124H∶0005H。

圖2-21 實際存儲器中段的位置

圖2-22 一個實際地址可對應多個邏輯地址
段首址來源于4個段寄存器,偏移地址來源于SP,BP,SI,DI,IP和計算出的有效地址。尋址時到底使用哪個段寄存器與哪個偏移地址存放寄存器搭配(表2-5所示的邏輯地址源就示出了這種搭配關系),由8086的BIU部件根據執行操作的種類和應取得的數據類型確定。
表2-5 邏輯地址源

4.堆棧
一般的微機系統都需要設立堆棧來暫存一批數值數據或地址數據,為此,要在內存儲器中特別劃分出一段存儲區。在該存儲區中,存取數據按“后進先出”的原則進行。
8086由于采用了存儲器分段,為了表示這特別劃分出來的存儲區,使用了一種稱為堆棧段的段來表示。堆棧段中存取數據的地址由堆棧段寄存器SS和堆棧指針SP來規定。SS中存放堆棧段的首地址,SP中存放棧頂的地址,此地址表示棧頂離段首址的偏移量,存取數據都在棧頂進行。堆棧段的示意圖如圖2-23(a)所示。

圖2-23 8086系統的堆棧及入棧、出棧操作
一個系統使用的堆棧數目不受限制,在有多個堆棧的情況下,各個堆棧用各自的段名來區分,但其中只有一個堆棧段是當前執行程序可直接尋址的,稱此堆棧段為當前堆棧段。SS中存放的是當前堆棧段的首址,SP指出當前堆棧段中的棧頂位置。一個堆棧段最大的范圍為64KB。用堆棧深度來表示堆棧段的容量大小。
堆棧的最典型應用是在調用子程序的程序中,為了實現程序正確的返回,需要將斷點地址和主程序中的一些數據暫存起來。斷點地址是指調用指令CALL的下條指令的地址,包括CS的值和IP的值。它們是在執行CALL時自動被存入堆棧的。主程序中的一些數據是指運行子程序時可能要被覆蓋的一些CPU內部寄存器的數據,這些數據需要用專門的入棧操作指令PUSH推入堆棧暫存,而子程序執行完畢,又應該用出棧指令POP將它們彈回原來的地方,并按“先進后出”的原則編排出棧指令順序(可參考第3章例3-2)。最后,子程序執行到返回指令RET時,自動將入棧的斷點地址返送回IP和CS中,根據IP具備的程序跟蹤功能,又回到主程序的斷點地址繼續執行后續程序。
8086的堆棧操作有兩種:入棧操作PUSH和出棧操作POP,均為16位的字操作,而且都在棧頂進行。棧頂是由堆棧指針SP所指的“實”棧頂。所謂“實”棧頂,是以最后推入堆棧信息所在的單元為棧頂,如圖2-23(a)所示的10508H單元。圖2-23(b)為入棧操作,在執行入棧指令PUSH AX時,先修改堆棧指針SP,完成(SP)-2→(SP)后,才能將AX的內容推入。推入時,先推高8位AH入棧,完成(AH→((SP+1))=(10507H),然后推低8位AL入棧,完成(AL)→((SP))=(10506H)。入棧完成后,因(SP)=10506H而指向新的棧頂。圖2-23(c)示出出棧操作POP BX和POP AX。在執行第1條POP BX指令時,先將位于棧頂上的兩個單元的內容彈出到BX,具體執行的操作可分為如下3步。
第1步:將棧頂內容,即((SP))=(10506H)→BL(低位)。
第2步:將((SP)+1)=(10507H)→BH(高位)。
第3步:修改指針,即(SP)+2→(SP),此時的(SP)=10508H也指向一個新的棧頂。
接著執行第2條出棧指令POP AX,其操作類同于POP BX,只是最后修改指針(SP)+2→(SP)的結果,使(SP)=1050AH,又指向一個新的棧頂。
5.專用的和保留的存儲單元
Intel公司為保證與未來產品的兼容性,規定在存儲區的最低地址區和最高地址區留出一些單元供CPU作為某些特殊功能專用,或為將來開發軟件、硬件產品而保留。其中:
① 00000H~0007FH(共128B)用于中斷,以存放中斷向量表。
② FFFF0H~FFFFFH(共16B)用于系統復位啟動。
IBM遵照這種規定,在IBM PC/XT這種最通用的8086系統中也做了相應規定:
① 00000H~003FFH(共1KB)用來存放中斷向量表,該表上列出了每個中斷處理子程序的入口地址。一個入口地址占4字節,前2字節中存放入口的偏移地址(IP值),后2字節中存放入口的段首址(CS值)。因此,1KB區域可以存放256個中斷處理程序的入口地址。對一個具體的機器系統而言,256級中斷是用不完的,空著的可供用戶擴展功能時使用。當系統啟動引導完成,這個區域的中斷向量表就建立起來了。
② B0000H~B0FFFH(共4KB)是單色顯示器的視頻緩沖區,存放單色顯示器當前屏幕顯示字符所對應的ASCII碼及其屬性。
③ B8000H~BBFFFH(共16KB)是彩色顯示器的視頻緩沖區,存放彩色顯示器當前屏幕像素點所對應的代碼。
④ FFFF0H~FFFFFH(共16B)用于系統復位啟動,一般存放一條無條件轉移指令,使系統在上電或復位時,自動轉到系統的初始化程序,這個區域被包含在系統的ROM范圍內,在ROM中駐留著系統的基本I/O系統程序BIOS。
由于有了專用的和保留的存儲單元的規定,使用Intel公司CPU的IBM PC/XT及各類兼容微機都具有較好的兼容性。
6.單模塊程序的4個現行段
為了使存儲器分段及其在匯編語言程序中的具體實現盡早結合,下面列舉了一個具有4個現行段的單模塊匯編語言程序框架的實例。
【例2-1】 程序功能:完成5+2=7的運算,將結果存入數據區中的SUM單元,并在屏幕上顯示出來。此例的重點在于了解運行一個程序所需的4個現行段(代碼段、數據段、堆棧段和附加段)在程序中如何表示出來。這里,設前3個段是相互分開的,而附加段與數據段完全重疊。每個段都標有段名,用偽指令SEGMENT/ENDS來定義,每個段不超過64KB,由DOS操作系統給它們分配存儲地址。
源程序框架及其4個現行段編排如下。注:程序中每一行的編號是為進行下面的解釋加入的,在實際輸入程序時不應該輸入。
1 ;SAMPLE PROGRAM FOR ADD AND DISPLAYING SUM TO THE SCREEN ; 2 DATA SEGMENT ;數據段 3 AUGEN DDB 05H 4 ADDEN DDB 02H 5 SUM DB ? 6 DATA ENDS ; 7 STACK SEGMENT PARA STACK ′STACK′ ;堆棧段 8 DB 64 DUP(?) 9 STACK ENDS ; 10 CODE SEGMENT ;代碼段 ; 11 ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA 12 START PROC FAR 13 PUSH DS ;保存返回地址 14 MOV AX,0 15 PUSH AX 16 MOV AX,DATA ;初始化DS,ES 17 MOV DS,AX 18 MOV ES,AX ; 19 MOV AL,AUGEND ;完成05H+02H的程序正文 20 ADD AL,ADDEND 21 MOV SUM,AL ;存結果 ; 22 ADD AL,30H ;將結果變為ASCII碼 23 MOV DL,AL ;顯示結果 24 MOV AH,02H 25 INT 21H ; 26 RET ;返回DOS 27 START ENDP ; 28 CODE ENDS ; 29END START ;匯編結束
第1行為程序的注釋,用“;”開頭,為非執行部分。2~6行為數據段,該段內設置有運行本程序所需的被加數AUGEND,加數ADDEND,還保留有一個存結果的單元SUM,它們均用偽操作指令DB進行定義。本段的段名為DATA,第2行和第6行是段定義語句,分別定義段的開始和終結。7~9行為堆棧段,段名為STACK,第7行和第9行分別定義該段的開始和終結,該段中用DB定義了一個深度為64字節的堆棧區。10~28行為代碼段,該段段名為CODE,第10行和第28行分別定義該段的開始和終結。代碼段中用“;”開始的漢字部分為注釋(也可用英文注釋),用它來說明一條或幾條指令的作用;第12行為過程(Procedure)的說明語句PROC,過程有NEAR(近)過程和RAR(遠)過程之分。這里為FAR過程,它是DOS下面的一個遠過程。第12行和第27行分別表示過程的開始和結束,第26行的RET是返回語句,本例中應返回到DOS。第11行ASSUME也是一個說明語句,由它設定運行該程序時所需的4個現行段是什么段名,其中的ES和DS用相同段名,表示這兩個段完全重疊。第19~21行是完成5+2運算并存儲結果的部分,是本程序的正文部分。運算結果7是一位十進制數,可用第22行指令將其變為ASCII碼后,由第23~第25行的一個中斷調用INT 21H的02H功能交由屏幕顯示出來。第19~25行是本模塊的程序段,它隨應完成的功能不同而不同。第13~18行對不同功能的程序段都是需要的,是不能改變的部分,通常稱為程序的內務操作,這是保證程序能正確運行,并返回操作系統而不被死鎖的必須部分。內務操作又包含兩部分:第13~15行是保存返回地址(其原理將在第4章中講述)所用的3條固定語句,第16~第18行是對數據段和附加段進行初始化,即把DOS給每個段分配的首地址(段名的地址)填入相應的段寄存器DS、ES中,對除CS以外的用到的現行段均需填入。第2~6行的數據段和第7~9行的堆棧段隨程序段的功能不同,應用的情況也不同。最后指出,本例所示的單模塊程序結構是匯編語言源程序結構框架之一,可供學習指令系統一章時仿照使用。
還要說明,這種程序結構,只要在程序段中沒有調用指令或沒有中斷發生,堆棧段被默認也是可行的;這里的附加段也可以不設置。不設置的段就不在ASSUME語句中出現,也不對相應的段寄存器進行初始化裝填。
2.2.8 8086 I/O端口組織
1.I/O端口
8086 CPU和外部設備之間是通過I/O接口芯片作為界面進行聯系的,達到在其間傳輸信息的目的。每個I/O接口芯片上可有一個至幾個端口。一個n位的端口實際上是存取數據的一個n位的寄存器。在系統設計時,要為每個端口分配一個地址,稱為端口地址或端口號。每個端口號和存儲器單元地址一樣,應具有唯一性。
2.I/O端口編址方式
一般來說,I/O端口有存儲器映象編址和獨立編址兩種方式。
(1)存儲器映象編址的I/O
在這種編址方式下,將I/O端口地址置于存儲器空間,和存儲單元統一編址。因此,存儲器的各種尋址方式都可用來尋址端口。這樣,對端口的訪問非常靈活,而且I/O接口與CPU的連接方法和存儲器芯片與CPU的連接方法類似。但這種方法的缺點是端口占用了一部分存儲器空間,而且端口地址的位數和存儲器單元地址位數一樣,比獨立編址的I/O端口地址長,因而訪問速度較慢。Motorola系列的CPU采用了這種I/O端口的編址方法。
(2)獨立編址的I/O
凡是設有專門輸入指令IN和輸出指令OUT的CPU對I/O端口都進行獨立編址。8086 CPU采用了這種編址方法。它使用20條地址總線中的A15~A0(16條)地址線對端口地址進行編址,因此,最多可訪問的I/O端口可有64K個8位端口或32K個16位端口,任何兩個相鄰的8位端口可以組成一個16位端口。和訪問存儲器一樣,對奇數地址的16位端口的訪問,要進行兩次才能完成。端口的尋址不分段,因而不用段寄存器。8086的端口地址仍為20位,高4位總是為0。
3.保留的I/O端口
在8086的64KB的I/O空間中,F8H~FFH這8個地址是Intel公司保留使用的,用戶不能占用,否則將影響用戶系統與Intel公司產品的兼容性。