第二章 暫存器
-
一.通用暫存器
-
通用暫存器通常用來存放一般性的資料。
-
二.字在暫存器中的儲存
出於對相容性的考慮,8086CPU可以一次性處理兩種尺寸的資料:
- 1.位元組:記為byte,一個位元組由8個位元(即二進位制位)組成,可以存在8位暫存器中。
- 2.字:記為word,一個字由兩個位元組組成,這兩個位元組分別稱為這個字的高位位元組和低位位元組。
-
三.實體地址
CPU通過地址匯流排送入儲存器的必須是一個記憶體單元的實體地址。 在CPU向地址總線上發出實體地址之前,必須在內部先形成這個實體地址。 不同的CPU可以有不同的形成實體地址的方式。
16位結構的CPU
-
16位結構的CPU具有下面幾方面的結構特性:
- 運算器一次最多可以處理16位的資料
- 暫存器最大寬度為16位
- 暫存器和運算器之間的通路為16位
-
-
記憶體單元的地址在送上地址匯流排之前,必須在CPU中處理、傳輸、暫時存放,對於16位CPU,能一次性處理、傳輸、暫時儲存16位的地址。
8086CPU給出實體地址的方法
8086CPU有20位地址線,可以傳送20位地址,達到1MB的定址能力。8086CPU又是16位結構,在內部一次性處理、傳輸、暫時儲存的地址為16位。從8086CPU的內部結構來看,如果將地址從內部簡單地發出,那麼它只能送出16位的地址,表現出的定址能力只有64KB。事實上,8086CPU採用一種在內部用兩個16位地址合成的方法來形成一個20位的實體地址。
-
8086CPU相關部件的邏輯結構如圖所示: 當8086CPU要讀寫記憶體時:(1).CPU中的相關部件提供兩個16位地址,一個稱為段地址,一個稱為偏移地址(2).段地址和偏移地址通過內部匯流排送入一個稱為地址加法器的部件(3).地址加法器將兩個16位地址合併成喲個20位實體地址(4).地址加法器通過內部匯流排將20位實體地址送入輸入輸出控制電路(5).輸入輸出控制電路將20位實體地址送上地址匯流排(6).20位實體地址被地址匯流排傳送到儲存器地址加法器採用實體地址=段地址X16+偏移地址的方法用段地址和偏移地址合成物理地址
四.段的概念
"段地址"中的“段”的概念,其實來自於CPU。記憶體並沒有分段,段的劃分來自於CPU。
五.段段暫存器
段地址在8086CPU的段暫存器中存放。8086有4個段暫存器:CS,DS,SS,ES。
六.CS和IP
當8086CPUCPU要訪問記憶體時由這4個段暫存器提供記憶體單元的段地址。
-
CS和IP是8086CPU中兩個最關鍵的暫存器,他們指示了CPU當前要讀取指令的地址。
- CS為程式碼段暫存器
- IP為指令指標暫存器
-
在8086PC中,任意時刻,設CS中的內容為M,IP中的內容為N,8086CPU將從記憶體M×16+N單元開始,讀取一條指令並執行。也可以描述為:8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。
-
如圖顯示了8086CPU讀取、執行指令的工作原理:
- 8086CPU當前狀態:CS中的內容為2000H,IP中的內容為1000H
- 記憶體20000H~20009H單元中存放著可執行的機器碼
-
七.修改CS、IP的指令
在CPU中,程式設計師能夠用指令讀寫的部件只有暫存器,程式設計師可以通過改變暫存器的內容實現對CPU的控制。 CPU從何處執行指令是由CS、IP中的內容決定的,程式設計師可以通過改變CS、IP中的內容來控制CPU執行目標指令。8086CPU大部分暫存器的值,都可以通過mov指令來改變。mov指令被稱為傳送指令。mov指令不能用於設定CS、IP的值,原因是:8086沒有提供這樣的功能。能夠改變CS、IP的內容的指令被統稱為轉移指令。
八.程式碼段
對於8086PC機,在程式設計時,可以根據需要,將一組記憶體單元定義為一段。可以將長度為N(N<=64KB5)的一組程式碼,存在一組地址連續、起始地址為16的倍數的記憶體單元中。存在這段記憶體單元中的程式碼可以成為一個程式碼段。
將一段記憶體當作程式碼段,僅僅是我們在程式設計時的一種安排,CPU並不會由於這種安排,就自動的將我們定義的程式碼段中的指令當作指令來執行。CPU只認被CS:IP指向的記憶體單元中的內容為指令。要讓CPU執行我們放在程式碼段中的指令,必須要將CS:iP指向所定義的程式碼段中的第一條指令的首地址。
- 九.總結
- 段地址在8086CPU的段暫存器中存放。當8086CPU要訪問記憶體時,由段暫存器提供記憶體單元的段地址。8086CPU有4個段暫存器,其中CS用來存放指令的段地址。
- CS存放指令的段地址,IP存放指令的偏移地址。
- 8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行
- 8086CPU的工作過程:(1)從CS:IP指向記憶體單元讀取指令,讀取的指令進入指令緩衝器(2)IP指向下一條指令(3)執行指令(4)轉到步驟(1),重複這個過程
- 8086CPU提供轉移指令修改CS、IP的內容。