8086處理器
處理器是計算機系統的硬件核心部件,決定着計算機的關鍵性能,常被稱為中央處理單元,簡稱CPU。
功能結構
處理器由多個功能部件組成。Intel公司按兩個功能模塊描繪了Intel 8086處理器的內部結構:

總線接口單元和執行單元
總線接口單元BIU(Bus Interface Unit)由6字節的指令隊列(指令寄存器)、指令指針IP、段寄存器(CS、DS、SS和ES)、地址加法器和總線控制邏輯等構成。
總線接口單元BIU管理着 8086 與系統總線的接口,負責處理器對存儲器和外設進行訪問。
8086 所有對外操作必須通過 BIU 和這些總線進行,例如從主存中讀取指令、從主存或外設讀取數據、向主存或外設寫出數據等操作。
執行單元EU(Execution Unit)由算術邏輯單元ALU(Arithmetic Logic Unit)、標志寄存器、通用寄存器和進行指令譯碼的EU控制電路等構成,負責執行指令的功能。
源程序由一條條語句組成,運行程序將執行一條條的指令。一條指令的執行可以分為兩個主要階段:取指和執行。
取指階段:處理器將指令代碼從主存儲器中取出並進入處理器內部的過程。(隊列形式)
執行階段:處理器將指令代碼翻譯成它代表的功能(被稱為譯碼)、並發出有關控制信號實現這個功能的過程。
總線接口單元BIU負責從存儲器取出這個指令代碼,送入指令隊列。執行單元EU從指令隊列中獲得預先取出的指令代碼進行運算和傳遞等操作。具體如下圖所示:

指令預取
8086處理器維護着長度為6字節的指令隊列,該隊列按照“先進先出”FIFO(First In First Out)的方式進行工作。
指令的讀取操作在BIU單元實現,而指令的執行階段在EU單元完成。它們互相獨立且可並行操作。
其中指令隊列如果空缺,BIU會自動填補空缺,當程序不按順序執行,BIU會廢除已取出的指令而重新取指形成新的指令隊列。

由於要譯碼執行的指令已經預取到了處理器內部的指令隊列,所以 8086 不需要等待取指操作就可以從指令隊列獲得指令進行譯碼執行。
寄存器
處理器內部需要高速存儲單元,用於暫時存放程序執行過程中的代碼和數據,這些存儲單元被稱為寄存器(Register)。處理器內部設計有多種寄存器,每種寄存器還可能有多個,從應用的角度可以分成兩類:透明寄存器和可編程寄存器。
透明寄存器:有些寄存器對應用人員來說不能通過指令直接編程控制,所以稱之為透明寄存器。
可編程寄存器:底層語言程序員需要掌握可編程(Programmable)寄存器。它們具有引用名稱、供編程使用。
其中可編程寄存器又可以划分為兩種:
通用寄存器:在處理器中數量較多、使用頻度較高,具有多種用途。比如存放指令需要的數據等。
專用寄存器:各自只用於特定目的。比如記錄將要執行指令的主存地址、標志寄存器保存指令執行的輔助信息。
8086的寄存器有8個16位通用寄存器、4個16位段寄存器、1個16位標志寄存器和1個16位指令指針寄存器:

通用寄存器
通用寄存器(General-Purpose Register)一般是指處理器最常使用的整數通用寄存器,可用於保存整數數據、地址等。
8086 處理器的 8 個 16 位通用寄存器,分別被命名為:AX、BX、CX、DX、SI、DI、BP和SP。
其中前4個通用寄存器AX、BX、CX和DX還可以進一步分成高字節H(High)和低字節L(Low)兩部分。
所以前4個寄存器又有8個8位通用寄存器:AH和AL、BH和BL、CH和CL、DH和DL。
通用寄存器的用途很多,可以保存數據、暫存運算結果,也可以存放存儲器地址、作為變量的指針。
| 名稱 | 中英文含義 | 作用 |
|---|---|---|
| AX | 累加器(Accumulator) | 使用頻率最高,用於算術、邏輯運算以及與外設傳送信息等 |
| BX | 基址寄存器(Base) | 常用作存放存儲器地址,以方便指向變量或數組中的元素 |
| CX | 計數器(Counter) | 常用作為循環操作等指令中的計數器 |
| DX | 數據寄存器(Data) | 可用來存放數據,中輸入輸出指令存放外設端口地址 |
| SI | 源變址寄存器(Source Index) | 用於指向字符串或數組的源操作數 |
| DI | 目的變址寄存器(Destination Index) | 用於指向字符串或數組的目的操作數 |
| BP | 基址指針寄存器(Base Pointer) | 默認情況下指向程序堆棧區域的數據,主要用於中子程序中訪問通過堆棧傳遞的參數和局部變量 |
| SP | 堆棧指針寄存器(Stack Pointer) | 專用於指向程序堆棧區域頂部的數據,中涉及堆棧操作的指令中會自動增加或減少 |
許多指令需要表達兩個操作數(操作對象,例如加法指令的被加數以及加法結果):
源操作數是指被傳送或參與運算的操作數(例如:加法的被加數)。
目的操作數是指保存傳送結果或運算結果的操作數(例如:加法的和值結果)。
SI和DI是變址寄存器,常通過改變寄存器表達的地址指向數組元素。SI常用於指向源操作數,而DI常用於指向目的操作數。
堆棧(Stack)是一個特殊的存儲區域,它采用先進后出FILO的操作方式存取數據。
BP和SP是指針寄存器,用於指向堆棧中的數據。它會隨着處理器執行有關指令而自動增大或減小。
標志寄存器
標志(Flag)用於反映指令執行結果或控制指令執行形式。處理器中用一個或多個二進制位表示一種標志,其0或1的不同組合表達標志的不同狀態。
Intel 8086支持的9個標志,分為狀態標志和控制標志兩類,采用一個16位的標志寄存器FLAGS保存:

狀態標志是最基本的標志,用於記錄指令執行結果的輔助信息。主要包括加減運算和邏輯運算指令。
狀態標志有6個,處理器主要使用其中5個構成,它們從低位到高位分別是:
進位標志CF(Carry Flag)
奇偶標志PF(Parity Flag)
調整標志AF(Adjust Flag)
零標志ZF(ZeroFlag)
符號標志SF(Sign Flag)
溢出標志OF(Overflow Flag)
控制標志用於控制處理器執行指令的方式,可由程序根據需要用相關指令設置。
8086的控制標志有3個,它們分別是:
方向標志DF(Direction Flag),僅用於串操作指令中,控制地址的變化方向;
中斷允許標志IF(Interrupt-enable Flag),或簡稱中斷標志,用於控制外部可屏蔽中斷是否可以被處理器響應;
陷阱標志TF(Trap Flag),也常稱為單步標志,用於控制處理器是否進入單步操作方式。
指令指針寄存器
程序的指令存放最主存儲器中,處理器用專用寄存器表示將要執行的指令最主存的位置,這個位置用存儲器地址表示。
最8086處理器中,這個存儲器地址保存最16位指令指針寄存器IP(Instruction Pointer)中。
指令指針寄存器IP是一個專用寄存器,具有自動增量的能力。處理器執行完一條指令, IP就加上該指令的字節數,指向下一條指令,實現程序的順序執行。需要實現分支、調用等操作時需要修改 IP,它的改變將引起程序轉移到指定的指令執行。
IP寄存器不能像通用寄存器一樣直接賦值修改,需要執行控制轉移指令(如跳轉、分支、調用和返回指令)、出現中斷或異常時被處理器賦值而相應改變。
段寄存器
段寄存器是因為對內存的分段管理而設置的。計算機需要對內存分段,以分配給不同的程序使用。
對應用程序來說,主要涉及3類基本段:
存放程序中指令代碼的代碼段(CodeSegment)
存放當前運行程序所用數據的數據段(Data Segment)
指明程序使用的堆棧區域的堆棧段(Stack Segment)
段其實是主存的一個連續區域,為了表面段最主存中的位置,8086處理器設計有4個16位段寄存器:
代碼段寄存器CS,堆棧段寄存器SS,數據段寄存器DS和附加段寄存器ES (Extra Segment)
注意:附加段也是用於存放數據的數據段,專為處理數據串設計的串操作指令必須使用附加段作為其目的操作數的存放區域。
存儲器組織
個人計算機主板上的主存條和一個ROM芯片構成主存儲器,保存正在運行使用的指令和數據。
存儲單元和存儲單位
主存儲器被划分成許多存儲單元,每個存儲單元都有一個順序號碼,稱為存儲單元地址或存儲器地址(Memory Address)。
主存儲器的每個存儲單元具有一個地址,保存一個字節(8個二進制位)的信息,這稱為字節編址(Byte Addressable),也直譯為字節可尋址,因為通過一個存儲器地址可以訪問到一個字節信息。
計算機由二進制機器碼組成,其中8個二進制位組成一個字節(Byte),常用大寫字母B表示。
位編號由右向左(由低位向高位)從0開始遞增計數為D0~D7,如下圖所示:

其中,二進制數據的右邊為最低位,左邊為最高位:
右邊最低位稱為最低有效位LSB(Least Significant Bit)
左邊最高位稱為最高有效位MSB(Most Significant Bit),對應字節、字、雙字長度的數據。
主存儲器使用字節作為基本存儲單位,也就是\(2^{10}=1024\)的二進制倍數關系,而硬盤或U盤廠商則使用\(10^3\)倍數關系。

物理地址和邏輯地址
主存條和ROM芯片構成的主存儲器需要處理器通過總線進行訪問,被稱為物理存儲器。
物理存儲器的每個存儲單元有一個唯一的地址,就是物理地址(Physical Address)。物理地址空間從0開始順序編排,直到處理器支持的最大存儲單元。
二進制位有0和1兩種狀態,即2(=\(2^1\))個編碼;那么,2位有00、01、10和11共4(\(2^2\))個編碼,以此類推可以得到N位有\(2^N\)個編碼。
8086處理器具有20位地址總線,那么它支持\(2^{20}\),即1M個存儲單元。而每個存儲單元保存一個字節,所以8086可以支持1MB存儲器容量,其物理地址空間是0 ~ \(2^{20} - 1\)。
地址(編號)習慣用十六進制數表達,20位數字信號對應二進制20位,可以用5位十六進制數表達為:00000H~FFFFFH,如下圖所示:

由於8086處理器只有16位寄存器,不能完整保存20位物理地址,而使用16位表示存儲器地址,可以表達的存儲器容量是64KB(\(2^{16}\)字節),范圍是:0000H~FFFFH。
8086處理器將1MB物理存儲器空間分成許多不超過64KB的區域管理,這種區域稱為段(Segment)。段用於8086內部和程序設計中,所以常被稱為邏輯段。
8086處理器規定每個段低4位只能是全為0的物理地址,也就是能被16整除的地址,表示為:XXXX0H,此時低4為都是0的情況可以省略,那么20位物理地址就可以只表達高16位。
所以,編程中使用的邏輯地址(Logical Address),它包括段基地址和偏移地址,都可以使用 16 位表示。
段基地址確定該段在主存中的起始地址。以段基地址為起點,段內的位置可以用距離該起點的位移量表示,稱為偏移地址(Offset)。
邏輯地址使用英文冒號":"來分割段基地址和偏移地址:段基地址:偏移地址.
所以最8086處理器中邏輯地址轉換為物理地址的方式如下:
段基地址左移4位(十六進制一位) + 偏移地址 = 20位物理地址
注意:同一個物理地址可以有多個邏輯地址,但是存儲單元只能有一個物理地址。
應用程序的基本段
8086有四種類型的邏輯段來實現存儲器的分段管理,有4個段寄存器保存對應的段基地址(保存高16位)。

分段管理存儲空間屬於模塊化思想,英語程序通常需要使用三種類型的段:
代碼段、堆棧段和數據段,8086還設計有一個屬於數據段類型的附加段。
程序指令代碼必須安排最代碼段,否則無法正常執行。
解析:程序利用代碼段寄存器CS獲得當前代碼段的段基地址,指令指針寄存器IP保存代碼段中指令的偏移地址。處理器利用CS:IP的方式取得下一條需要執行的指令。
程序使用的堆棧(臨時存放數據的區域)一定在堆棧段。
解析:程序利用SS獲得當前堆棧段的段基地址,堆棧指針寄存器SP保存堆棧棧頂的偏移地址。處理器利用SS:SP操作堆棧數據。
存儲器的分段管理
8086 規定段基地址低 4 位均為 0,每段最大不超過 64KB。但是每段可以不是64KB,它們可以完全分開、部分重疊、或完全重疊。各段的內容是不允許發生沖突的。

圖中a是各段獨立分配的示例,各段均占64KB字節范圍,互相獨立。
圖中b是互相重疊段的分配示例。各段大小應根據實際需要來分配,可以重疊。
