## 2.3 寄存器
80386中應用程序員感興趣的有16個寄存器。如圖2-5所示,這些寄存器被分成以下幾個基本類型:
1.通用寄存器。這些32為通用寄存器主要用來數學和邏輯運算。
2.段寄存器。這些特殊目的寄存器允許系統軟件設計者選擇平坦模式或是段模式。這六個寄存器決定了,任何時候,哪段存儲器可以被尋址。
3.狀態和指令寄存器。這些特殊目的寄存器用于記錄和改變80386處理器狀態的一些特征。
### 2.3.1 通用寄存器
80386的32位通用寄存器包括EAX, EBX,ECX, EDX, EBP, ESP, ESI以及EDI。這些寄存器可以互換使用,存儲邏輯和算術操作數。也可以互換地用于地址計算(有個例外,ESP不能被用作索引操作數)。
如圖2-5所示,這8個寄存器中的低位字都有單獨的名稱,可以單獨使用。這有利于處理16位數據項,以及和8086和80286保持兼容。字寄存器被命名為AX, BX, CX, DX, BP, SP, SI以及DI。
圖2-5同樣表明,16為寄存器AX, BX, CX和DX的每個字節都有單獨的名稱,可以獨立使用。這有利于處理字符和8位數據項。字節寄存器被稱為AH, BH, CH, DH(高位字節);AL, BL, CL, DL(低位字節)。
所有這些寄存器均可以用來地址計算,作為大多數算術和邏輯計算的結果;然而,一些功能要求使用特定的寄存器。通過隱式的使用這些寄存器,80386架構可以使編碼變得更緊湊。使用特定寄存器的指令包括:雙精度乘法和除法,I/O,字符串指令,變換,循環,變量移位和循環,堆棧操作。
### 2.3.2 段寄存器
段寄存器給了系統軟件設計人員在各種存儲器組織模式之間選擇的自由。存儲器模式的實現是第II部分的主題-系統編程。設計人員可以選擇一種模式,這種模式下,應用程序不需要改變段寄存器,在這種情況下,應用程序員可以跳過這章。
完整的程序通常包含許多不同的模塊,每個由指令和數據構成。然而,在任何給定的程序執行時間段,只有一小部分程序模塊的子集在使用。80386架構可以利用了這一點,它提供直接訪問當前模塊環境的手段,在有需要時訪問其他段。
在任何給定的時間,六個存儲器段可以在程序執行期間被立即訪問。段寄存器CS, DS, SS, ES, FS和GS用來標識這六個當前段。這些寄存器每個都表示一個特殊類型的段,就像圖2-6中關聯助記符(”code”, “data”, 或者”stack”)表示的那樣。每個寄存器唯一地確定一個特殊段,這些段組成了程序,在稍后以最快的速度被立即訪問。
包含當前指令執行序列的段稱為當前代碼段;它通過CS寄存器來聲明。80386將指令指針的內容作為偏移量,從這個段來提取所有當前指令。CS寄存器在段內控制傳輸指令執行(例如,CALL和JMP)后被隱式的改變。
子程序,參數和程序活動記錄通常要求在堆棧上分配一塊存儲空間。所有堆棧操作都用SS來定位堆棧。與CS不同,SS可以被顯示的加載,從而允許程序動態的定義堆棧。
DS, ES, FS和GS寄存器允許聲明4個數據段,每個都可以被正在執行的程序尋址。訪問4個獨立的數據區幫助程序高效的訪問不同的數據類型;例如,一個數據段寄存器指向當前模塊的數據結構,另一個執行上層模塊導出的數據,另一個指向動態創建的數據,而另一個指向和其他任務共享的數據。段內的操作數可以在指令中聲明偏移量或通過通用寄存器來間接訪問。
取決于數據結構(比如說,數據被放到一個或更多段內的方式),一個程序可能需要訪問多于4個數據段。要想訪問額外的段,DS, ES, FS和GS可以在程序執行期間在控制下改變。只需要在訪問數據的指令前面執行一條指令來加載合適的段寄存器。
處理器會把一個基地址和每個由段寄存器選擇的段聯系起來。要想尋址段內的數據項,32位的偏移量被加到段基址上。一旦選擇了一個段(通過加載段選擇符到段寄存器),數據操作指令只需要聲明偏移量。如果只聲明了偏移量,使用一個簡單的規則來確定使用哪個段寄存器。




### 2.3.3 堆棧的實現
堆棧操作通過下面的三個寄存器變得容易些:
1.堆棧段寄存器(SS)。堆棧的實現在存儲器中。系統可以有多個堆棧,只受限于堆棧總數的上限值。堆棧可以有4G空間,堆棧的最大長度。在同一時刻只能有一個堆棧可以訪問-SS定位的那個。這個是當前堆棧,常被簡稱為“這個“堆棧。處理器的所有堆棧操作自動使用SS。
2.堆棧指針寄存器(ESP)。ESP指向向下增長堆棧(TOS)的頂部。ESP被下面的操作間接引用:PUSH和POP操作,子程序調用和返回,以及中斷操作。當數據被放入堆棧時(見圖2-7),處理器減小ESP,然后將數據寫入新的TOS。當數據從堆棧彈出時,處理器從TOS中拷貝數據,然后增加ESP。換句話說,堆棧在內存中項低位地址方向增長。
3.堆棧幀基指針(EBP)。EBP是訪問堆棧中的數據結構,變量和動態分配的工作空間的最好選擇。EBP經常通過相對堆棧的一個固定參考點而不是當前TOS來訪問數據項。它的典型用法是標識為當前進程建立的當前堆棧幀的基地址。當EBP用作偏移計算的基址寄存器是,偏移量自動在當前堆棧段內(即,由SS選擇的當前段)計算。因為SS不用顯示的聲明,這種編碼指令更有效。EBP也可以用作是通過其他尋址段寄存器的索引。

### 2.3.4 標志位寄存器
標志位寄存器為32為寄存器,命名為EFLAGS。圖2-8定義了寄存器中位。這些標志空著特定的操作并表示80386的狀態。
EFLAGS的低16位被命名為FLAGS,可以單獨使用。該特性在執行8086和80286代碼時非常有用,因為EFLAGS的這部分和8086和80286的FLAGS寄存器是一樣的。
標志位可以分為3組:狀態標志位,控制標志位,以及系統標志位。系統標志位的討論推遲到第II部分。

2.3.4.1 狀態標志位
EFLAGS寄存器的狀態標志位允許一條指令的結果影響下一條指令。算術指令使用OF, SF, ZF, AF, PF和CF。SCAS(掃描字符串),CMPS(比較字符串),以及LOOP指令使用ZF來通知它們的動作已結束。有些指令可以在算術指令執行之前設置,清除以及取反CF。每個狀態標志位的定義參見附錄C。
2.3.4.2 控制標志位
EFLAGS的控制標志位DF控制著字符串指令。
DF(方向標志位,位10)
設置DF標志位使字符串指令自動遞減;也就是,從高位地址到低位地址處理字符串。清除DF使字符串指令自動遞增,從低位地址到高位地址處理字符串。
2.3.4.3 指令指針
指令指針寄存器(EIP)包含相對于當前代碼段內下一個將執行的指令序列的地址偏移量。對于程序員來說,指令指針不是直觀可見的;它被控制傳輸指令,中斷以及異常隱式控制。
如圖2-9所示,EIP的低位16位被命名位IP,可以單獨使用。該特性對于執行位8086額80286設計的指令非常有用。

- 第一章 80386介紹
- 1.1 該手冊的組織結構
- 1.2 其他文獻
- 第二章 編程基本模型
- 2.1 存儲器組織和段
- 2.2 數據類型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作數選擇
- 2.6 中斷和異常
- 第4章 系統寄存器
- 4.1 系統寄存器 (System Registers)
- 4.2 系統指令 (System Instructions)
- 第五章 內存管理
- 5.1 分段地址轉換(Segment Translation)
- 5.2 分頁地址轉換(Page Translation)
- 5.3 混合分段和分頁地址轉換(Combining Segment and Page Translation)
- 第六章 內存管理
- 6.1 為什么要保護(Why Protection?)
- 6.2 80386保護機制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段級保護(Segment-Level Protection)
- 6.4 頁級保護(Page-Level Protection)
- 6.5 混合分頁和分段保護(Combining Page and Segment Protection)
- 第7章 多任務(Multitasking)
- 8.1 I/O 尋址(I/O Addressing)
- 7.1 任務狀態段(Task State Segment)
- 7.3 任務寄存器(Task Register)
- 7.4 任務門描述符(Task Gate Descriptor)
- 7.5 任務切換(Task Switching)
- 7.6 任務鏈(Task Linking)
- 7.7 任務尋址空間(Task Address Space)
- 第8章 輸入 輸出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保護和I/O(Protection and I/O)
- 第9章 異常和中斷(Exceptions and Interrupts)
- 9.1 識別中斷(Identifying Interrupts)
- 9.2 允許和禁止中斷(Enabling and Disabling Interrupts)
- 9.3 同時發生的中斷和異常的優先級(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中斷描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中斷任務和中斷子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出錯碼(Error Code)
- 9.8 異常條件(Exception Conditions)
- 9.9 異常總結(Exception Summary)
- 9.10 出錯碼總結(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 復位后處理器狀態(Processor State After Reset)
- 10.2 實模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切換到保護模式(Switching to Protected Mode)
- 10.4 保護模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB測試
- 第十四章 80386實地址模式
- 14.1 物理地址構成
- 14.2 寄存器和指令
- 14.3 中斷和異常處理
- 14.4 進入和離開實地址模式
- 14.6 實地址模式異常
- 14.7 與8086的不同
- 14.8 與80286實地址模式的不同