8086/8088 CPU寄存器組


      今天來回顧一下8086/8088 CPU寄存器組的知識。其實8086匯編還是很久以前學過的,Win32匯編也接觸過一些,但是由於長時間不碰,生疏了不少。今后可以花點時間總結總結,梳理一下以前學習過的知識,盡管暫時還用不上,但這樣就便於以后需要用到的時候很容易撿起來。我知道博客園里大多數人都是搞Web或者手機開發的,相信用匯編的人也不多,不過工作之余學一學匯編,了解一些計算機底層的知識,對自己的“身心”是有幫助的。希望自己能堅持把8086匯編完整地寫完,如果有精力還可以寫一寫win32匯編。


 

      這一節先從8086/8088 CPU寄存器組開始說起。

    說到8086/8088 CPU寄存器組,它們的特點就是都是16位的,不論是通用寄存器、段寄存器還是標志寄存器。

    8086/8088包括四個16位數據寄存器,兩個16位指針寄存器,兩個16位變址寄存器,一個16位指令指針寄存器,四個16位段寄存器,一個16位標志寄存器。總共有14個寄存器,這14個寄存器分成四組。我從《80x86匯編語言程序設計教程》電子版上截了一張圖,它描繪了這14個寄存器的名稱和分組情況。

通用寄存器

    何謂通用寄存器,簡單來說就是經常用到的寄存器。按照上圖我們不難發現,數據寄存器、指針寄存器和變址寄存器統稱為通用寄存器。這些寄存器除了各自規定的專門用途外,它們均可用於傳送和暫存數據,可以保存算術邏輯運算中的操作數和運算結果。

數據寄存器

    數據寄存器主要用來保存操作數或運算結果等信息,它們的存在節省了為存取操作數所需占用總線和訪問存儲器的時間。

    四個16位的數據寄存器均可分解成八個獨立的8位寄存器,這八個8位的寄存器有各自的名稱,均可獨立存取。比如:AX寄存器可以分解為AH寄存器和AL寄存器,其中AH寄存器就是AX寄存器的高8位,AL寄存器就是AX寄存器的低8位。其他寄存器類推。

    這四個數據寄存器除了它們通用的功能以外,還有其他專門的用途。

  •     AX和AL寄存器又稱為累加器(Accumulator),使用得比較普遍。
  •     BX寄存器稱為基(Base)地址存儲器,它是四個數據存儲器中唯一可以作為存儲器指針使用的存儲器。
  •     CX寄存器稱為計數(Count)寄存器。在字符串操作和循環操作時,用它來控制重復循環操作次數。在移位操作時,CL寄存器用於保存移位的位數。
  •     DX寄存器稱為數據(Data)寄存器。在進行32位的乘除法操作時,用它存放被除數的高16位或余數。它也用於存放I/O端口地址。

變址和指針寄存器

     變址和指針寄存器主要用於存放某個存儲單元地址的偏移,或某組存儲單元開始地址的偏移,即作為存儲器指針使用。

     作為通用寄存器,它們也可以保存16位算術邏輯運算中的操作數和運算結果,有時運算結果就是需要的存儲單元地址的偏移。注意,16位的變址寄存器和指針寄存器不能分解成8位寄存器使用。

     SI和DI寄存器稱為變址寄存器。在字符串操作中,規定由SI(Source Index)給出源指針,由DI(Destination Index)給出目的指針。當然,SI和DI也可作為一般存儲器指針使用。

     BP和SP寄存器稱為指針寄存器。BP(Base Pointer)主要用於給出堆棧中數據區基址的偏移,SP(Stack Pointer)通常只作為堆棧指針使用,即保存堆棧棧頂地址的偏移。

 

段寄存器

     8086/8088 CPU依賴其內部的四個段寄存器實現尋址1M字節物理地址空間(20條地址線)。8086/8088把1M字節地址空間分成若干邏輯段,當前使用段的段值存放在段寄存器中。

     8086/8088 CPU的4個段寄存器分別稱為代碼段(Code Segment)寄存器CS、數據段(Data Segment)寄存器DS、堆棧段(Stack Segment)寄存器SS、附加段(Extra Segment)寄存器ES。那么就有四個當前使用段可直接存取,這四個當前段分別稱為代碼段、數據段、堆棧段和附加段。

 

控制寄存器

指令指針寄存器

     8086/8088 CPU中的指令指針IP(Instruction Pointer)給出接着要執行的指令在代碼段中的偏移,通過CS:IP即可訪問CPU要執行的下一條指令。

標志寄存器

     雖然標志寄存器是16位,但實際包含了9個標志,主要用於反映處理器的狀態和運算結果的某些特征。各標志在標志寄存器中的位置如下所示。

       標識寄存器又稱程序狀態寄存器(Program Status Word)。它是一個存放條件碼標志位控制標志系統標志的寄存器。

      1)條件碼標志用來記錄程序中運行結果的狀態信息,它們是根據有關指令的運行結果由CPU自動設置的。由於這些狀態信息往往作為后續條件轉移指令的轉移控制條件,所以為條件碼。它包括以下6位:

  •   溢出標志(overflow flag, OF),在運算過程中,如操作數超過了機器能表示的范圍稱為成為溢出。此時OF置為1,否則置0。
  •   符號標志(sign flag, SF),記錄運算結果的符號,結果為負時置1,否則置0。
  •   零標志(zero flag, ZF),運算結果為0時ZF位置1,否則置0。
  •   進位標志(carry flag, CF),記錄運算時從最高有效位產生的進位值。例如,執行加法指令時,最高有效位有進位時置1,否則置0。
  •   輔助進位標志(auxiliary carry flag, AF),記錄運算時第3位(半個字節)產生的進位值。例如,執行加法指令第3位有進位時置1,否則置0。
  •   奇偶標志位(parity flag,PF),用來為機器中傳送信息時可能產生的代碼出錯情況提供檢驗條件。當結果操作數中1的個數為偶數時置1,否則置0。

 

      2)控制標志位為方向標志(direction flag, DF),在串指令中控制處理信息的方向用。當DF位為1時,每次操作后使變址寄存器SI和DI減小,這樣就使串處理從高地址向低地址方向處理。當DF位為0時,則使SI和DI增大,使串處理從低地址向高地址方向處理。

 

      3)系統標志位可以用於I/O、可屏蔽中斷、程序調試、任務切換和系統工作方式等的控制。一般應用程序不必關心或修改這些位的狀態,只有系統程序員或需要編制底層I/O設備控制等程序時才需要訪問其中的有關位。

  •   陷阱標志(trap flag, TF),用於調試時的單步方式操作。當TF位為1時,每條指令執行完后產生陷阱,由系統控制計算機;當TF位為0時,CPU正常工作,不產生陷阱。
  •   中斷標志(interrupt flag, IF),當IF位為1時,允許CPU響應可屏蔽中斷請求,否則關閉中斷。
  •   I/O特權級(I/O privilege level, IOPL),在保護模式下,用於控制對I/O地址空間的訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM