一、8086/8088 CPU 功能結構
Intel 公司於 1978 年推出了標准 16 位微處理器 8086。由於它的內部、外部數據總線寬度都為 16 位,產品推向市場后,當時 8 位接口芯片出現兼容問題,於是又生產了准 16 位微處理器 8088,將外部數據總線改為 8 位,以解決與外圍電路的兼容問題。8086 與 8088 CPU 結構與原理除上述差別外,從軟件設計角度幾乎沒有什么差別。
Intel 8086/8088 CPU 功能結構如圖 4 所示。 CPU 采用指令流水線結構,把訪問存儲器(含取指令、存取數據操作等)與執行指令分成兩個獨立單元:總線接口單元 BIU(Bus Interface Unit)和執行單元 EU(Execute Unit)。

圖 4 Intel 8086/8088 CPU 功能結構
執行單元 EU 的功能是從 BIU 的指令隊列中取出指令代碼,然后執行指令所規定的全部功能。如果在執行指令過程中,需要向存儲器或 I/O 端口傳送數據,EU 向 BIU 發出訪問命令,並提供訪問的地址和數據。
總線接口單元 BIU 負責 CPU 與存儲器及 I/O 端口的信息傳送。具體功能是根據段寄存器 CS 和指令指針 IP 形成 20 位物理地址,從存儲器中取出指令,並暫存在指令隊列中,等待 EU 取走執行。如 EU 發出訪問存儲器或 I/O 端口的命令時,BIU 根據 EU 提供的地址和數據,進入外部總線周期,存取數據。
由此可知,EU 和 BIU 是既分工又合作的兩個獨立單元。它們的操作是並行的,分別完成不同的任務,因而大大加快了指令執行速度。
二、CPU內部寄存器組
對於匯編語言指令,被操作的數據或運算的中間結果可以放在 CPU 內部的寄存器中,也可以放在存儲器(內存)中。尤其是 CPU 內部的寄存器,在指令中使用的頻度最大,因為訪問寄存器要比訪問存儲器更快捷,匯編語言程序設計者掌握 CPU 中各寄存器的用途是非常重要的。
Intel 8086/8088 CPU 內部共有 14 個 16 位寄存器,如圖 5 所示。根據其作用可分為通用寄存器、段寄存器、指令指針、標志寄存器等。

圖 5 Inter 8086/8088 CPU 內部寄存器
(一)通用寄存器
通用寄存器共有 8 個,它們的作用是存放參加操作的數據或程序運算的結果,它們的特點是具有良好的通用性。在大多數情況下,這些寄存器可以互換地進行各種操作。例如,在程序的一條指令中把一個數據保存在 BX 中或是其他任意一個通用寄存器中是沒有區別的。但有少數指令又規定了某些寄存器具有特定的用法。例如,在循環指令(loop)中,循環次數必須放在 CX 中;兩個字節相乘的指令中,其中一個數必須放入 AL 中,而結果積隱含在 AX 中。因此,習慣上把 CX 叫作計數器,把 AX 叫作累加器,這就是每個寄存器用途名稱的由來。
8 個通用寄存器根據使用的情況可分為如下 3 種。
1. 數據寄存器
它包含 AX、BX、CX、DX 4 個寄存器,其特點是它們中的每一個,既可作為十六位寄存器來使用,也可作為兩個 8 位寄存器單獨使用。因此,這 4 個十六位寄存器也可以看成是 8 個獨立的八位寄存器 AH、AL、BH、BL、CH、CL、DH、DL,這些寄存器的雙重性使得程序很容易處理字節和字信息。
2. 間接尋址寄存器
間接尋址寄存器由 2 個基址寄存器 BX、BP 和 2 個變址寄存器 SI、DI 構成,它們都是 16 位寄存器。它們的特點是可以用來存放程序中要訪問的內存單元的偏移地址,也可以作為通用寄存器使用,以存放操作數和運算結果,這一點和數據寄存器的作用是沒有差別的。
3. 指針寄存器
指針寄存器包含堆棧指針 SP 和基指針 BP,當它們作為存放地址的寄存器使用時,特定地指向內存中的堆棧段。SP 的特殊性還在於調用和返回指令以及中斷指令等操作都會引起 SP 中地址的自動改變。當然 SP 和 BP 同樣可以作為數據寄存器使用。
(二)段寄存器
Intel 8086/8088 CPU 將存儲器划分成若干段(如圖 6 所示),把將要運行的程序各部分(代碼、數據等)分別放在不同的存儲段中。每個存儲段用一個段寄存器來指示它的首地址(即段地址)。當 CPU 訪問某存儲單元(如取指令或數據存取操作數)時,就必須明確該存儲單元在哪個段寄存器指向的存儲段中,同時給出該存儲單元在這個存儲段內的偏移地址(即偏移量)。一個存儲單元與它所在段的段基址之間的距離(以字節數計)叫該存儲單元的偏移地址,也叫偏移量。

圖 6 用段寄存器指明存儲段
一個程序把存儲器划分成多少個存儲段可以是任意的,但用 CS、DS、ES、SS 段寄存器分別指明的段叫作當前段。在程序運行的任何時刻,最多只能有 4 個當前段。4 個段寄存器有各自的作用,不能互換。CS 一定是指向存放有指令代碼的代碼段,SS 指向被開辟為堆棧區的堆棧段,DS 和 ES 通常指向存放數據和工作單元的數據段。
(三)指令指針 IP
IP 是程序不能訪問的寄存器,它與其他計算機和微處理器中程序計數器 PC 的作用類同,是指令的地址指針。在程序運行期間,CPU 自動修改 IP 的值,使它始終保持為正在執行指令的下一條指令代碼的起始字節的偏移量。
用戶編制的程序不能直接訪問 IP,即不能用指令去取出 IP 的值或給 IP 設置給定值。但是某些指令的執行可以自動修改 IP 的內容。例如執行轉移指令 JMP、JNE 等,把目的地址的偏移量送入 IP;執行調用子程序指令 CALL 時,IP 原有內容自動壓入堆棧,把子程序入口地址偏移量自動送入 IP。當從子程序返回主程序時,返回指令 RET 又自動從堆棧中彈回原有 IP 的內容送回 IP。
(四)標志寄存器
8086/8088 CPU 設置了 1 個十六位標志寄存器,用來反映微處理器在程序運行時的狀態。標志寄存器中定義了 9 個標志位,其中 6 個標志位(CF、PF、AF、ZF、SF、OF)作為狀態標志,狀態標志隨指令的執行動態改變着,記載每一條指令剛執行完后的某些特征。另外 3 個標志位(TF、IF、DF)作為控制標志,在執行某些指令時起控制作用。圖 7 中除指明控制標志位外,其余均為狀態標志位。

圖 7 標志寄存器
1. 狀態標志
(1)進位標志 CF(Carry Flag)。
當進行算術運算時,如最高位(對字操作是第 15 位,對字節操作是第 7 位)產生進位(加法運算)或借位(減法運算),則 CF 置 1,否則置 0。CF 也可在移位類指令中使用,用它保存從最高位(左移時)或最低位(右移時)移出的代碼(0 或 1)。
(2)奇偶標志 PF(Parity Flag)。
若操作結果低八位中含有 1 的個數為偶數時,則 PF 置 1,否則 PF 置 0。PF 只檢查操作結果的低八位,與該指令操作數的長度無關。
(3)輔助進位標志 AF(Auxiliary Carry Flag)。
當進行算術運算時,若低半字節向高半字節產生進位(加法)或借法(減法)時,則 AF 置 1,否則置 0。AF 只反映運算結果的低八位,與操作數長度無關,它是用於十進制運算的調整。
(4)零標志 ZF(Zero Flag)。
若運算結果各位全為 0 時,則 ZF 置 1,否則置 0。
(5)符號標志 SF(Sign Flag)。
把運算結果視為帶符號數。當運算結果為負數時,則 SF 置 1,為正數時,則置 0。所以,SF 與運算結果的最高位(符號位)相一致。
(6)溢出標志 OF(Overflow Flag)。
當運算的結果超過機器用補碼所能表示數的范圍時,則 OF 置 1,否則置 0。產生溢出一定是同號數相加或異號數相減的情況。
2. 控制標志
以下 3 個標志為控制標志。
(1)陷阱標志(或單步標志)TF(Trap Flag)。
當 TF=1 時,在執行完一條指令后就停下來(產生單步中斷),然后由單步中斷處理程序把 TF 置 0。TF 供調試程序用,如在調試程序 debug 中,可以使用單步命令,在每條指令執行后就停下來進行檢查。
(2)中斷標志 IF(Interrupt Flag)。
當 IF=1 時,允許響應可屏蔽中斷。相反,IF=0 時,則不允許響應可屏蔽中斷。可用開中斷指令 STI 和關中斷指令 CLI 設置 IF 的狀態。
(3)方向標志 DF(Direction Flag)。
DF 為串操作指令規定增減方向。當 DF=0 時,串操作指令自動地使變址寄存器(SI 和 DI)遞增(即串操作是從低地址到高地址方向進行的)。當 DF=1 時,則自動地使變址寄存器遞減(即串操作是從高地址到低地址方向進行的)。DF 的狀態可用 STD 和 CLD 指令設置。
原文:Intel 8086/8088 CPU 結構與可編程寄存器
(完)