之前,我們給出了計算機系統模型,它並不特別針對某一種具體的計算機系統,只是為讀者快速搭建一個深入計算機系統底層的框架。並且,在上一章中,著重介紹的是整個計算機系統的基本組成以及它的工作原理。由於CPU是計算機系統中的核心部件,機器指令的執行是由它來完成的,因此,細化理解CPU的基本結構以及它的工作原理成為學習指令系統的基礎。本章將針對8086/8088CPU晶片,介紹其基本構成與工作原理,為學習下一章的80868088CPU指令系統做好準備。讀者應當注意,這一章的內容組織與之前所學習的不同,一方面,它著重介CPU這一個功能模塊的結構和原理,而不是整個計算機系統;另一方面,它針對的是特定型號的CPU晶片,而不是一般化的模型。

8086、8088兩種CPU晶片的區別主要在於數據引腳的數量,也即它們所連接的數據總線寬度。8086能夠連接16位數據總線,一次總線操作最多可以讀取一個字(在80868088中為16位)的數據量,而8088隻能連接8位數據總線,一次總線操作最多只能讀取一個字節(8位)。但這兩種CPU晶片的內部結構幾乎是完全一致的,CPU內部能夠並行處理的最大二進位位數都是一個字。接下來我們將了解8086/8088CPU晶片的基本結構與它們的工作原理。想要知道晶片的基本結構即工作原理,我們需要知道以下六點。1.基本的流水線結構從圖4.1.1可以看到,CPU內部結構分為BIU和EU兩個功能模塊。其中BIU的全稱為 Bus Interface Unit,即總線接口單元,其主要功能是實現CPU與系統總線的信號連接、數據交換。所有與總線操作相關的時序過程都由BIU模塊執行,其中最頻繁的是內存單元、埠的數據讀寫操作;所有有關物理地址的計算機過程也由BIU完成。EU的全稱為Execute Unit,即執行單元,它的主要功能為解釋並執行指令。將CPU分為兩個功能模塊的目的在於讀取指令與執行指令這兩個步驟能夠在時間上重疊,從而基本實現流水線結構。
2.指令隊列
指令隊列這一部件位於BIU模塊,它具有多個字節的存儲單元。每次BU模塊啟動讀取下一條指令的操作後,將所讀取到的指令(字節數隨不同指令而變化)暫存在指令隊列中。只要總線出現空閒,BIU模塊就會自動啟動讀取指令的時序操作,直到指令隊列填充滿為止。位於EU中的控制器會將指令隊列中的機器指令操作碼欄位讀取出來,並解碼生成相應控制信號,從而執行指令。指令隊列中的機器指令被讀取的順序按照先進先出FIFO的隊列結構原則,最先由BIU保存在指令隊列中的指令,最先被EU讀出執行。應當注意,讀取指令這一時序過程與執行指令無關,它是由BIU自動啟動的,因而指令隊列與我們後面將要介紹的寄存器組不同,它們不能被機器指令訪問。換言之,我們在設計彙編語言程序時,不能操作指令隊列,它是由CPU自動管理的。
3.控制器控制器位於CPU的EU模塊,它是CPU的控制中心,無論是作用於CPU內部的控信號,還是CPU發送到系統總線的控制信號,幾乎全部在這裡產生,而產生控制信號的依據則來源於對機器指令操作碼欄位的解碼。由於本教材只說明CPU工作的基本原理,因此指令解碼器的原理與設計方法請讀者參閱《計算機組成原理》相關教材。控制器按照機器指令規定的時序產生控制信號,如果控制信號需要發送到控制總線,則控制器將這些控制信號傳送到BU模塊的總線控制邏輯這一部件,由總線控制邏輯將控制信號傳遞到控制總線。4.地址加法器地址加法器位於BIU模塊,它的功能是由邏輯地址計算物理地址,並最終由該器件將物理地址傳送到BIU的總線控制邏輯,再由總線控制邏輯將物理地址傳送到地址總線。在說明地址加法器的運算原理前,我們將先說明邏輯地址的概念,以及CPU對內部存儲器的分段管理方式。我們已經說明了8086/8088CPU能支持的地址總線寬度以及物理地址範圍,8086/8088CPU能支持的地址總線寬度為20位,對於內部存儲器而言,其尋址範圍為1M字節,而訪問埠時僅使用地址總線的低16位,因而埠尋址範圍為64K字節。在CPU內部,所有寄存器的二進位位數最大為16位,因此,沒有哪一個寄存器能夠存放20位的物理地址。那麼,我們如何在CPU內部表達外部存儲單元的物理地址呢?為了協調CPU內外地址位數的差異,8086/8088CPU採用了對存儲器的分段管理方式,並使用邏輯地址為CPU內部的物理地址表達形式。首先,解釋段的概念,一個段是指位於內部存儲器中的一塊連續存儲空間,它由物理地址連續的多個字節單元構成。那麼,何謂邏輯地址?它與物理地址的關係又是怎樣的呢?邏輯地址由兩個16位的地址分量構成,其中一個為段基址,另一個為偏移量,兩個分量均為無符號數編碼。邏輯地址轉換為物理地址運算過程可表示:
段基址=段基值 * 16
物理地址=段基址+偏移量
首先,16位的段基址左移4位,低位補充4個0,相當於乘以24,得到20位的段基址。段基址為20位,已經可以理解為物理地址,但它僅是一個段的起始地址,要使CPU能夠定位段內的所有內存單元,那麼必須在段基址的基礎上加上偏移量。偏移量的含義為距離段基址的偏移字節數。偏移量指定不同,那麼所訪問的內存單元也就不同。應當注意,20位的段基址與16位的偏移量相加,是低位對齊的加法,加法結果即為20位物理地址。我們還應當注意,任意指定一個確定的邏輯地址,那麼經過式(4.1.1)轉換後得到的物理地址是唯一的,換言之,給定一個邏輯地址,就能唯一地定位一個內存單元。但是相反的轉換過程並不能得到唯一的結果,給定一個物理地址,我們並不能得到唯一的段基址、偏移量分解,好在這種逆轉換在系統內是沒有用途的,地址加法器也只實施由邏輯地址到物理地址的轉換那麼,既然在CPU內部使用的是邏輯地址,相應地,我們在進行彙編語言程序設計時所使用的內存單元地址也就是邏輯地址,而非物理地址。物理地址僅在CPU執行總線操作時出現,換言之,物理地址存在於程序的執行階段,而非程序的設計階段。對埠地址而言,由於其僅使用地址總線的低16位,因此,邏輯地址等同於物理地址,我們不去區分它們地址加法器所完成的操作就是將邏輯地址轉換為物理地址後,提交給總線控制邏輯。這樣的地址轉換可能發生在BU讀取指令時,也可能發生在EU執行指令時,還可能發生在其他的時序過程中。最後,讀者也許會問:段基值與偏移量分別保存在CPU的什麼位置呢,它們是怎樣計算得到的呢?CPU中提供了一個段寄存器組,段基值就是由這一組16位段寄存器提供的。而偏移量的獲取方式則豐富得多,也複雜得多,它們既可以來自於機器指令中的位移量欄位,也可以來自於指令指針寄存器,或者有幾種分量相加而得到。有關偏移量的獲取方式,我們將在以後分析尋址方式時詳細討論。

5.運算器運算器位於CPU的EU模塊,用於完成機器指令要求的算術運算、邏輯運算功能,是CPU內的運算中心,最大支持雙操作數運算,例如兩個操作數相加或相減等,它除了完成機器指令指定的數據運算外,還可用於生成邏輯地址中的偏移量分量。若為數據運算,其操作數可能來源於數據寄存器、內存單元、指令中的立即數;若為偏移量運算,其操作數均解釋為偏移量分量,來源於地址指針寄存器、指令中的位移量。如果機器指令有這樣的要求,運算器會將運算過程和運算結果的某些性質按照標誌位的形式保存到標誌寄存器。有關運算器的詳細原理,我們將在第5章學習基本指令系統時體會到6.總線控制邏輯總線控制邏輯位於BIU模塊,用於控制在適當的時刻向總線傳遞相應信號,或從總線上接受相應信號,CPU只能通過總線控制邏輯才能與系統總線實現信號交互。由於總線控制邏輯是CPU自動進行管理的,我們的指令沒辦法直接操作該器件,因此在這裡不詳述其原理,讀者可參閱《計算機組成原理》相關教材。
這就是CPU的基本原理及其運行的原理