1. 程式人生 > 實用技巧 >微機原理筆記一.8086CPU的結構與功能

微機原理筆記一.8086CPU的結構與功能

CPU結構與功能

不管什麼型號的CPU,其內部均有這四大部件

  1. ALU:算術邏輯單元
  2. 工作暫存器:分為資料暫存器和地址暫存器

工作暫存器的目的是為了提高運算速度,希望參與運算的資料不從外部儲存器去取資料,而是在CPU內部取,所以要有能暫存少量資料的暫存器。

資料暫存器是專門存放資料的,地址暫存器是專門存放地址,進行間接定址方式,但當地址暫存器不提供地址時,也可以用來暫存資料。

  1. 控制器:中央指揮機關
  2. I/O控制邏輯電路

一般CPU執行儲存器(按位元組組織)裡面指令過程如下:

  1. CPU通過控制器部件裡面的程式計數器(PC)給外部儲存器的地址引腳輸出地址(通過地址匯流排AB),同時CPU給儲存器傳送讀操作命令;
  2. 在讀操作下,就把這個地址單元的指令程式碼通過資料匯流排(DB),取回來放在指令暫存器裡面(IR),注意此時因為指令沒有指令,所以PC還不能去往下一條指令,IR沒有地方放資料。
  3. 指令譯碼器(ID)不斷檢測指令暫存器有沒有資料,有的話就把指令取走放在ID裡面,取來的指令就被ID譯碼分析,就知道這個指令希望CPU做什麼,怎麼做;
  4. ID通知控制邏輯部件,在相應的控制引腳發出相應的有效命令(讀,寫等);
  5. 此條指令執行完,IR為空,PC自動增加到下一條指令的地址,執行下一條指令流程。如果指令為n位元組,PC自動增n。

    因為在取指令時候,不能執行指令,在執行指令時候,不能取指令,因此這種架構CPU是取指令->執行指令->取指令...這樣迴圈下去。CPU執行效率不高。

堆疊

由先進後出原則組織的儲存器區域,稱為堆疊。

微控制器應用中,堆疊是個特殊儲存區,堆疊屬於RAM空間的一部分,堆疊用於函式呼叫、中斷切換時儲存和恢復現場資料(臨時資料)。

對於8006 CPU而言,堆疊操作是按字操作。

堆疊單元的地址指標由堆疊指標暫存器SP的內容提供。

堆疊操作中兩個最重要的是PUSH(入棧)和POP(出棧)。

入棧舉例:

執行指令

PUSH AX
PUSH BX

AX是8086裡面一個16位暫存器,

初始化後,SP指向棧底加1的地址。

PUSH AX這條指令完成的功能分為2部分:

  1. 先把SP的內容減2,再放回SP,SP=SP-2,此時SP指向棧底加1地址。空出了一個字單元。
  2. 將AX的低8位放在低地址單元,高8位放在高地址單元

    需要注意的是:棧頂是活動的。執行完PUSH AX後,AL所在單元就是棧頂。再執行 PUSH BX,BL所在單元就是棧頂,而棧底是固定的。

當SP指標超出堆疊區時,稱為堆疊操作溢位。溢位的話,會造成宕機。堆疊區大小需要根據實際程式定義,工程設計應該留出30%的富餘量。

出棧舉例:

因為遵循先進後出原則,出棧先執行POP BX

  1. 把SP的16位內容做棧頂地址,從該地址單元讀出一個字給BX

  2. SP指標自動增加2

然後再執行 POP AX

8086 CPU的內部結構

前面提到一般微處理器的內部結構,因為她存在效率低的問題,所以intel才研發出8086。

8086的內部結構:

指令佇列暫存器類似前面的指令暫存器IR,不同的是,在8086中,指令佇列暫存器相當於6個IR(6個位元組)。

只要指令佇列暫存器沒放滿,就可以繼續取。

BIU主要負責,從外部儲存器中取指令,並將取回的指令放在指令佇列中。

EU主要負責從指令佇列中獲取指令,遵循先進先出原則,並對該指令譯碼分析,加以執行。

8086做到了取指令和執行指令的並行操作,大大提高了效率。這種並行操作到現在依舊存在。

8086 CPU的暫存器組織

8086 CPU共有14個16位的暫存器。

按功能分,可以分為3類。

一.通用暫存器

即EU部分的8個暫存器。

  1. 資料暫存器:AX、BX、CX、DX。

    在有資料運算時,目的運算元儘量選AX,這樣運算比其他暫存器快。

BX常用來提供段內地址,來進行間接定址。

DX在IO指令中,用來做IO地址暫存器。

  1. 地址指標

地址指標暫存器有2個:

  • SP-堆疊指標暫存器:用來指示堆疊區的段內偏移地址。
  • BP-地址指標暫存器:BP和BX的作用類似,但她預設的是堆疊段內的段內偏移地址,BX是資料段內的偏移地址。

舉例

執行指令

mov BX,0002H
mov BP,0002H
mov AL,34H
mov [BX],AL

指令將AL的內容寫到資料段的地址0002H單元中。

而如果執行

mov [BP],AL

則是將AL的內容寫到堆疊段的地址0002H單元中。

  1. 變址暫存器

如果我們希望將BP提供的地址是給資料段寫,則需要在前面加上段超越字首 “DS:”,指明地址指向資料段,簡稱段字首。即:

mov DS:[BP],AL

變址暫存器也有兩個:

  • SI-源變址暫存器
  • DI-目標變址暫存器

這兩個暫存器都可以當作地址暫存器,預設指向資料段。“變”來源於8086 CPU對字串的操作。

舉例:

我們想將字串從源串搬到目的串。我們可以用MOV這種資料傳送的方式,但8086為了提高效率,專門為字串開闢了一種指令-字串操作指令。除了傳送外,還有其他的操作。在3.13小節。

源串必須定義在DS段,字串的偏移首地址,必須由SI提供。

目的串必須定義在ES段,偏移首地址,必須由DI提供。

為了將源串搬到目的串,我們可以執行

MOVSB

“S”表示位元組,“B”表示位元組,一次搬一個位元組。她沒有源運算元和目標運算元。但是CPU知道源串和目的串的地址在哪裡。如果從首地址開始搬,CPU搬完一個位元組後,會將地址自動"變",即加1。如果原來的指標是末地址,則會自動地減1。自動加減地址,就是“變址”的含義。

需要注意:變址只有在SI和DI當作字串操作時候才變。

二.段暫存器

段暫存器有4個:

  1. CS-程式碼段暫存器,指明程式程式碼所在的邏輯段地址。
  2. DS-資料段暫存器
  3. ES-附加資料段暫存器
  4. SS-堆疊段暫存器

初始化時候,必須對DS、ESS、SS初始化,指明我們定義的段地址。而CS使用者不能初始化,由作業系統(編譯器)完成。CS不能做目的運算元,只可以讀,做源運算元。

三.控制暫存器

控制暫存器有2個

  1. IP-指令指標暫存器,用於提供程式程式碼區的偏移地址,等效於一般CPU的程式計數器PC。不能用作目標運算元。
  2. PSW-處理器狀態字暫存器,一共設定了9個標誌位,分為2類:1)狀態標誌,反映的是ALU運算後,結果的狀態。2)控制表示,用來控制CPU的執行狀態。

需要注意的是,對於CPU而言,外部的中斷是可以遮蔽的,內部不可以遮蔽。

8086 CPU的儲存器和I/O組織

一.儲存器地址空間與資料存放格式

1.地址空間

8086 CPU有20根地址匯流排,\(A_{19}~A_{16},A_{15}~A_{10},A_{9}~A_{0}\),8086利用這20根地址線全部用來為儲存器編址,所以8086能定址的儲存器地址空間為 \(2^{20}B=1MB\) (儲存器按位元組組織)。

同時用低16條給外部I/O埠編址,所以8086能定址的外部I/O地址空間為 \(2^{16}B=64KB\)

2.資料存放格式

資料存放在儲存器中,一般資料格式為:

  • 位元組型資料:一個位元組資料佔用一個地址單元。

我們可以用“偽指令”定義位元組型資料,“偽指令”不是告訴CPU做什麼的,這是“指令”的工作。

偽指令是告訴彙編器(將組合語言編譯成機器語言)做什麼,偽指令由彙編器解釋。

DB-位元組型資料偽指令 ,告訴彙編器定義一個位元組資料。

假設我們在DS段一開始就定義了3個位元組資料

DB 12H,12,-12

  • 字型資料

DW-字型資料定義偽指令,需要注意的是,儲存器中一個字單元,低位元組地址稱為該字單元的地址。高位元組地址不用說明。

如果字單元的地址是偶地址,則稱該單元為“對準的字單元”,如果是奇地址,則稱為“未對準的字單元”。CPU對對準的字單元操作,要快一倍。

這是因為,在8086 CPU中,有16根資料線,定義:對偶地址操作,走低8位資料線(D0 ~ D7);對奇地址操作,走高8位資料線(D8 ~ D15)。所以假設執行對對準的字單元寫,因為字單元地址是偶地址,並且要遵循高8位位元組資料存放在高地址單元,低8位資料存放在低地址單元,所以16位資料在一個週期就可以一次傳送完。而對未對準的字單元,則需要兩個週期,第一個週期傳送高8位資料,第二個週期傳送低8位。

  • 雙字型資料

DD-雙字型資料定義偽指令

二.儲存器的分段與實體地址的形成

1.為什麼要分段?

因為在8086 CPU有20根地址線,能定址 1MB 空間,但是CPU裡面提供地址的暫存器只有16位,只能定址 64KB地址空間,所以為了讓1MB空間定址完,必須把 1MB 分為許多的邏輯段來管理。

2.怎麼分段?

因為地址暫存器都是16位的,所以一個邏輯段最大就是64KB,實際當中可以根據需求定義大小。

規定:邏輯段的起始地址必須能被16整除,所以1MB最多有64K個邏輯段。

定義:

儲存器原來實際存在的地址稱為實體地址。用“PA”表示。

一個邏輯段的起始地址稱為“段基址”。

在一個邏輯段中,地址被分為兩部分描述:一個16位段地址和一個16位段內的偏移地址。這樣的描述方式我們稱為“邏輯地址”。在實際應用當中我們用到的都是邏輯地址。

3.實體地址的形成

已知某物理單元的邏輯地址,我們可以通過換算得到實體地址:

PA=段地址*16H+段內偏移地址

將一個16進位制數乘以16,相當於朝左移動一位。段內偏移地址又被稱為段內有效地址。

由於段與段之間存在重疊的部分,因此同一個物理儲存單元可以表示成不同的段地址和段內偏移地址。但是換算後的實體地址是唯一的。

舉例

取指令的操作:

BIU把CS的內容送給加法器,加法器對該內容乘以16,BIU再把IP的內容送給加法器相加,得到取指令所在儲存單元的20位實體地址,這20位實體地址通過地址產生與匯流排控制電路,送到外部的 A0~A20引腳。CS和IP的內容的產生和改變是由作業系統決定的,使用者無法更改。

資料傳送操作:

執行 MOV [BX],AX

EU通知BIU要進行寫操作,BIU停止讀指令操作,BIU把DS內容送給加法器乘以16,EU把BX的值沿內部資料匯流排送給BIU,BIU收到後再送給加法器相加,得到20位實體地址,然後EU再把AX的內容送到資料線,把20位實體地址送到地址線,同時給外部儲存器發一個寫命令,就把AX的內容寫到該單元中。如果該儲存單元是對準的,就花一個週期寫完,未對準就花兩個週期寫完。

4.各類指令的地址資訊