32位微處理器的編程結構

32位微處理器的寄存器模型,描述80386、80486及Pentium系列微處理器內部程序可見的寄存器結構。它兼容8086CPU原來的8個16位通用寄存器及原來的8個8位的寄存器,而且將原來的8個16位通用寄存器AX、BX、CX、DX、SI、DI、BP、SP均擴展成

32位的寄存器,即EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。在32位微處理器中,既可以使用保留的8位和16位寄存器,還可以使用32位寄存器。除了8086 CPU的4個16位的段寄存器之外,還增加了2個16位的數據段寄存器FS和GS。

按照功能不同,寄存器可以分為通用寄存器、指令指針、標誌寄存器及段寄存器4種類型。如何使用,後面章節介紹。

32位微處理器的編程結構

通用寄存器

共有8個32位通用寄存器,EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI,雖然它們都可以用於存放一般的數據,但是,不同的寄存器還可能有的書的用法,按照它們的功能差別,將其分為2組:

一組為通用數據寄存器;

另一組為指令指針與變址寄存器。

(1)通用數據寄存器

共計有4個32位的通用寄存器,EAX、EBX、ECX和EDX。通用數據寄存器一般用來存放8位、16位或32位的操作數。

EAX(Accumulator),累加器。EAX可以作為通用8位寄存器(AH和AL)、16位寄存器(AX)及32位寄存器(EAX)使用。

如果作為通用8位或16位寄存器使用時,則只改變EAX中低16位中相應的數據,其他位不改變。當CPU執行乘法指令、除法指令及調整指令時,EAX具有其固定的特殊用法。

EBX(Base),基址寄存器。EBX 可以作為通用8位寄存器(BH和BL)、16位寄存器(BX)及32位寄存器(EBX)使用。

如果作為通用8位或16位寄存器使用時,則只改變EBX中低16位中相應的數據,其他位不改變。在16位CPU中或32位機在實模式下,一般用BX存放存儲單元的偏移地址。

ECX(Count),計數寄存器。ECX 可以作為通用8位寄存器(CH和CL)、16位寄存器(CX)及32位寄存器(ECX)使用。

如果作為通用8位或16位寄存器使用時,則只改變ECX中低16位中相應的數據,其他位不改變。

ECX有用於計數的固定用法,移位和循環指令一般用於CL寄存器計數,重複的串操作指令一般用CX計數,LOOP/LOOPD 等指令用CX或ECX計數。

EDX(Data),數據寄存器。EDX 可以作為通用8位寄存器(DH和DL)、16位寄存器(DX)及32位寄存器(EDX)使用。

如果作為通用8位或16位寄存器使用時,則只改變EDX中低16位中相應的數據,其他位不改變。

CPU執行乘法指令時,EDX固定用來存放部分乘機,CPU執行除法指令時,EDX固定用來存放被除數及餘數等。

(2)指針及變址寄存器

4個32位的通用寄存器(ESP、EBP、ESI、EDI)都可以用作一般的32位數據寄存器,也可以用作一般的16位數據寄存器(SP、BP、SI、DI),

用作一般的16位數據寄存器時,與8086 CPU中的SP、BP、SI、DI兼容。另外,每個寄存器都有各自的專用場合。

ESP:32位的堆棧指針。以ESP位偏移地址,訪問的是堆棧存儲空間,一般用它來指向堆棧的棧底或棧頂。作16位使用時,與8086的SP堆棧指針兼容。

EBP:32位的基址指針,或稱基址寄存器。以EBP位偏移地址,默認訪問的是堆棧存儲空間,一般用它來存放偏移地址,以便訪問堆棧區。作16位使用時,與8086的基址指針BP兼容。

ESI:32位的源變址寄存器。ESI(或16位的SI)用於尋址串操作指令的圓數據串。

EDI:32位的目的變址寄存器。EDI(或16位的DI)用於尋址串操作指令的目的數據串。

指令指針

擴展的指令指針(EXtended Instruction Pointer,EIP)是一個32位的專用寄存器,專用於尋址當前需要取出的指令碼。當CPU從代碼段取出一字節指令後,EIP就自動加一,指向下一字節的指令碼。

當80386及以上的32位微處理器工作在保護模式下時,EIP的32位都有效;當工作在實模式下時,32位的EPI僅低16位(IP)有效,與8086兼容。

標誌寄存器

32位的標誌寄存器(EFLAGS)用於指示微處理器進行算術運算和邏輯運算後的狀態及控制微處理器的有關操作。80x86及Pentium系列微處理器標誌寄存器的低16位時8086CPU的標誌寄存器。

隨著微處理器的發展,相應的標誌寄存器的位數在進行擴充,8086及80286CPU都只具有16位的標誌寄存器,從80386到Pentium位處理器採用了32位的標誌寄存器。

EFLAGS在8086的16位EFLAGS基礎上擴充了高16位,其中,EFLAGS的b11~b0中保留了8086CPU中6個狀態標誌和3個控制狀態,增加了NT與IOPL標誌,高16位中新增了6個標誌位,這些擴充標誌位含義:

1)NT,嵌套任務標誌。當該位置被置成1時,表示當前所執行的任務正嵌套在另一任務中,該位的置1與清零都是通過任務的控制轉移來實現的,顯然,NT用於保護模式。

2)IOPI,I/O特權級別。用來表示I/O操作處於0~3級特權的哪一級,0級最高,3級最低,它是用於指明在保護模式下不產生異常中斷13而執行I/O指令時,要求當前特權級CPL的允許值。

3)RF(Resume Flag),恢復標誌。它是一個與單步、斷點調試一起使用的標誌。該位置1時,即使遇到斷點或調試故障,也不產生異常中斷1(即單步中斷)。成功執行完一條指令後,該位會自動清零。

4)VM(Virtual 8086 Mode),虛擬86方式標誌位。在保護模式下,若VM置1,CPU則轉移到虛擬8086模式。在此模式下,CPU像一個告訴的8086 CPU運行8086的指令,一旦返回保護模式後,此位清零。

5)AC,對準檢查標誌位。AC標誌僅對特權級3的程序即用戶程序有效,若AC=1,且系統級控制寄存器中AM位也為1狀態時,才允許對特權級3的程序進行數據的對準檢查,而且必須檢查。

若AC=0,則不允許對準檢查。一旦CPU未對準地址而訪問內存時,將產生異常中斷17.

6)VIF,虛擬中斷標誌位。在虛擬86方式下,VIF是中斷標誌IF的複製。

7)VIP,虛擬中斷位。指示是否有掛起的中斷,當VIP=1時,表示有一箇中斷正等待響應與處理。VIP與VIF都起到控制虛擬中斷的作用。

8)ID,識別標誌位。如果該標誌位能被置位和清零,則指明這個處理器能支持CPUID指令。CPUID指令可以提供該處理器的廠商、系列及模式等信息。

上述的8位標誌位中,前5個標誌位在80486 CPU中就已經存在了,後3個標誌位是Pentium處理器新增加的。

6個16位的段寄存器

32位微處理器包含六個16位的段寄存器,其中,包括8086CPU的四個段寄存器:代碼段寄存器CS、數據段寄存器DS、附加數據段寄存器ES、堆棧段寄存器SS

在實模式下,這四個段寄存器的使用與8086的兼容,即段寄存器中的二進制值左移4位,低4位補4個0後,再加上段內的偏移地址形成20位的物理地址。

但在保護模式下,它們作為段描述符,經過段頁式變換後才能產生物理地址。

32位微處理器新增加2個16位的段寄存器: FS和GS,這是2個附加的數據段寄存器。


分享到:


相關文章: