1.2.2 8086的寄存器
處理器內部需要高速存儲單元,用于暫時存放程序執行過程中的代碼和數據,這些存儲單元被稱為寄存器(Register)。處理器內部設計有多種寄存器,每種寄存器還可能有多個,從應用的角度可以分成兩類:透明寄存器和可編程寄存器。
有些寄存器對應用人員來說不能通過指令直接編程控制,例如:保存指令代碼的指令寄存器。它們對應用人員來說好像看不見一樣,被稱為透明寄存器。這里的“透明”(Transparency)是計算機學科中常用的一個專業術語,表示實際存在但從某個角度看好像沒有;運用“透明”思想可以使我們拋開不必要的細節,而專注于關鍵問題。
底層語言程序員需要掌握可編程(Programmable)寄存器。它們具有引用名稱、供編程使用,還可以進一步分成通用和專用寄存器:
⊙ 通用寄存器:這類寄存器在處理器中數量較多、使用頻度較高,具有多種用途。例如它們可用來存放指令需要的操作數據,又可用來存放地址以便在主存或I/O接口中指定操作數據的位置。
⊙ 專用寄存器:這類寄存器各自只用于特定目的。例如程序計數器PC(Program Counter)只用于記錄將要執行指令的主存地址,標志寄存器保存指令執行的輔助信息。
8086的寄存器有8個16位通用寄存器、4個16位段寄存器、1個16位標志寄存器和1個16位指令指針寄存器,如圖1-4(圖中數字15、7、0等依次用于表達二進制位D15、D7、D0)所示。
1. 通用寄存器
通用寄存器(General-Purpose Register)一般是指處理器最常使用的整數通用寄存器,可用于保存整數數據、地址等。8086處理器只有8個通用寄存器,數量有限。
8086 處理器的 8 個 16 位通用寄存器,分別被命名為:AX、BX、CX、DX、SI、DI、BP和SP。其中前4個通用寄存器AX、BX、CX和DX還可以進一步分成高字節H(High)和低字節L(Low)兩部分,這樣又有了8個8位通用寄存器:AH和AL、BH和BL、CH和CL、DH和DL。前4個通用寄存器在編程中,可以整個使用16位寄存器(例如:AX),也可以分成兩個8位使用:D15~D8(例如:AH)和D7~D0(例如:AL),對其中某8位的操作,并不影響另外對應8位的數據。
通用寄存器的用途很多,可以保存數據、暫存運算結果,也可以存放存儲器地址、作為變量的指針。但在 8086 處理器中每個寄存器又有它們各自的特定作用,并因而得名。程序中通常也按照其含義使用它們,如表1-2所示。
表1-2 8086處理器的通用寄存器
⊙ 源操作數是指被傳送或參與運算的操作數(例如:加法的被加數)。
⊙ 目的操作數是指保存傳送結果或運算結果的操作數(例如:加法的和值結果)。
SI和DI是變址寄存器,常通過改變寄存器表達的地址指向數組元素。SI常用于指向源操作數,而DI常用于指向目的操作數。
堆棧(Stack)是一個特殊的存儲區域,它采用先進后出FILO(First In Last Out)、也稱為后進先出LIFO(Last In First Out)的操作方式存取數據。它用于調用子程序時暫存數據、傳遞參數、存放局部變量,也可以用于臨時保存數據。BP和SP是指針寄存器,用于指向堆棧中的數據。其中,SP堆棧指針會隨著處理器執行有關指令自動增大或減小,所以SP不應該再用于其他目的,實際上可歸類為專用寄存器;但是 SP 又可以像其他通用寄存器一樣靈活地改變。
2. 標志寄存器
標志(Flag)用于反映指令執行結果或控制指令執行形式。許多指令執行之后將影響有關的狀態標志位;不少指令的執行要利用某些標志;當然,也有很多指令與標志無關。處理器中用一個或多個二進制位表示一種標志,其0或1的不同組合表達標志的不同狀態。Intel 8086支持的9個標志,分為狀態標志和控制標志兩類,采用一個16位的標志寄存器FLAGS保存,如圖1-5所示(圖上方的數字表示該標志在標志寄存器中的位置)。
狀態標志是最基本的標志,用來記錄指令執行結果的輔助信息。加減運算和邏輯運算指令是主要設置它們的指令,其他有些指令的執行也會相應地設置它們。狀態標志有6個,處理器主要使用其中5個構成各種條件,分支指令判斷這些條件實現程序分支。它們從低位到高位是:進位標志CF(Carry Flag)、奇偶標志PF(Parity Flag)、調整標志AF(Adjust Flag)、零標志ZF(Zero Flag)、符號標志SF(Sign Flag)、溢出標志OF(Overflow Flag)。
控制標志用于控制處理器執行指令的方式,可由程序根據需要用相關指令設置。8086的控制標志有3個:方向標志DF(Direction Flag),僅用于串操作指令中,控制地址的變化方向;中斷允許標志IF(Interrupt-enable Flag),或簡稱中斷標志,用于控制外部可屏蔽中斷是否可以被處理器響應;陷阱標志TF(Trap Flag),也常稱為單步標志,用于控制處理器是否進入單步操作方式。
3. 指令指針寄存器
程序由指令組成,指令存放在主存儲器中。處理器需要一個專用寄存器表示將要執行的指令在主存的位置,這個位置用存儲器地址表示。在 8086 處理器中,這個存儲器地址保存在16位指令指針寄存器IP(Instruction Pointer)中。
指令指針寄存器IP一個是專用寄存器,具有自動增量的能力。處理器執行完一條指令, IP就加上該指令的字節數,指向下一條指令,實現程序的順序執行。需要實現分支、調用等操作時需要修改 IP,它的改變將引起程序轉移到指定的指令執行。但 IP 寄存器不能像通用寄存器那樣直接賦值修改,需要執行控制轉移指令(如跳轉、分支、調用和返回指令)、出現中斷或異常時被處理器賦值而相應改變。
4. 段寄存器
一個程序當中,有可以執行的指令代碼,還有指令操作的各類數據等。遵循模塊化程序設計思想,希望將相關的代碼安排在一起,相關的數據安排在一起,于是(區)段(Segment)的概念自然出現。一個段安排一類代碼或數據。程序員在編寫程序時,可以很自然地把程序的各部分放在相應的段中。對應用程序來說,主要涉及3類基本段:存放程序中指令代碼的代碼段(Code Segment)、存放當前運行程序所用數據的數據段(Data Segment)和指明程序使用的堆棧區域的堆棧段(Stack Segment)。
段其實就是主存的一個連續區域,為了表明段在主存中的位置,8086處理器設計有4個16位段寄存器:代碼段寄存器CS,堆棧段寄存器SS,數據段寄存器DS和附加段寄存器ES (Extra Segment)。其中,附加段也是用于存放數據的數據段,專為處理數據串設計的串操作指令必須使用附加段作為其目的操作數的存放區域。