CPU結構與功能
不管什么型號的CPU,其內部均有這四大部件
- ALU:算術邏輯單元
- 工作寄存器:分為數據寄存器和地址寄存器
工作寄存器的目的是為了提高運算速度,希望參與運算的數據不從外部存儲器去取數據,而是在CPU內部取,所以要有能暫存少量數據的寄存器。
數據寄存器是專門存放數據的,地址寄存器是專門存放地址,進行間接尋址方式,但當地址寄存器不提供地址時,也可以用來暫存數據。
- 控制器:中央指揮機關
- I/O控制邏輯電路
一般CPU執行存儲器(按字節組織)里面指令過程如下:
- CPU通過控制器部件里面的程序計數器(PC)給外部存儲器的地址引腳輸出地址(通過地址總線AB),同時CPU給存儲器發送讀操作命令;
- 在讀操作下,就把這個地址單元的指令代碼通過數據總線(DB),取回來放在指令寄存器里面(IR),注意此時因為指令沒有執行完,所以PC還不能去往下一條指令,IR沒有地方放數據。
- 指令譯碼器(ID)不斷檢測指令寄存器有沒有數據,有的話就把指令取走放在ID里面,取來的指令就被ID譯碼分析,就知道這個指令希望CPU做什么,怎么做;
- ID通知控制邏輯部件,在相應的控制引腳發出相應的有效命令(讀,寫等);
- 此條指令執行完,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部分:
- 先把SP的內容減2,再放回SP,SP=SP-2,此時SP指向棧底減1地址。空出了一個字單元。
- 將AX的低8位放在低地址單元,高8位放在高地址單元
需要注意的是:棧頂是活動的。執行完PUSH AX后,AL所在單元就是棧頂。再執行 PUSH BX,BL所在單元就是棧頂,而棧底是固定的。
可以看出,棧底在高地址,棧頂在低地址。
當SP指針超出堆棧區時,稱為堆棧操作溢出。溢出的話,會造成死機。堆棧區大小需要根據實際程序定義,工程設計應該留出30%的富余量。
出棧舉例:
因為遵循先進后出原則,出棧先執行POP BX
-
把SP的16位內容做棧頂地址,從該地址單元讀出一個字給BX
-
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個寄存器。
- 數據寄存器:AX、BX、CX、DX。
在有數據運算時,目的操作數盡量選AX,這樣運算比其他寄存器快。
BX常用來提供段內地址,來進行間接尋址。
DX在IO指令中,用來做IO地址寄存器。
- 地址指針
地址指針寄存器有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單元中。
如果我們希望將BP提供的地址是給數據段寫,則需要在前面加上段超越前綴 “DS:”,指明地址指向數據段,簡稱段前綴。即:
mov DS:[BP],AL
- 變址寄存器
變址寄存器也有兩個:
- SI-源變址寄存器
- DI-目標變址寄存器
這兩個寄存器都可以當作地址寄存器,默認指向數據段。“變”來源於8086 CPU對字符串的操作。
舉例:
我們想將字符串從源串搬到目的串。我們可以用MOV這種數據傳送的方式,但8086為了提高效率,專門為字符串開辟了一種指令-字符串操作指令。除了傳送外,還有其他的操作。在3.13小節。
源串必須定義在DS段,字符串的偏移首地址,必須由SI提供。
目的串必須定義在ES段,偏移首地址,必須由DI提供。
為了將源串搬到目的串,我們可以執行
MOVSB
“B”表示字節,一次搬一個字節。她沒有源操作數和目標操作數。但是CPU知道源串和目的串的地址在哪里。如果從首地址開始搬,CPU搬完一個字節后,會將地址自動"變",即加1。如果原來的指針是末地址,則會自動地減1。自動加減地址,就是“變址”的含義。
需要注意:變址只有在SI和DI當作字符串操作時候才變。
二.段寄存器
段寄存器有4個:
- CS-代碼段寄存器,指明程序代碼所在的邏輯段地址。
- DS-數據段寄存器
- ES-附加數據段寄存器
- SS-堆棧段寄存器
初始化時候,必須對DS、ES、SS初始化,指明我們定義的段地址。而CS用戶不能初始化,由操作系統(編譯器)完成。CS不能做目的操作數,只可以讀,做源操作數。
三.控制寄存器
控制寄存器有2個
- IP-指令指針寄存器,用於提供程序代碼區的偏移地址,等效於一般CPU的程序計數器PC。不能用作目標操作數。
- 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.各類指令的地址信息