80386的寄存器組成(轉)

本文摘自

http://hengch.blog.163.com/blog/static/107800672009029104144323/

 

 

80386共提供7種類型的32位寄存器,如下:

  1. 通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI)
  2. 段寄存器(CS、SS、DS、ES、FS、GS)
  3. 指令指針寄存器和標誌寄存器(EIP、EFLAGS)
  4. 系統表寄存器(GDTR、IDTR、LDTR、TR)
  5. 控制寄存器(CR0、CR1、CR2、CR3、CR4)
  6. 調試寄存器(DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7)
  7. 測試寄存器(TR6、TR7)

    其中後三類寄存器是80386以後的CPU纔有的,以前的CPU完全沒有。

    下圖是前四類寄存器的大致示意圖:

80386的寄存器組成 - whowin - DOS編程技術

    本文只對這些寄存器做一個大致的介紹,其中有些特殊且有較大意義的寄存器,會另文介紹。

一、通用寄存器

    一組八個通用寄存器是對8086/80286通用寄存器的32位擴展,其用法與在8086/80286中相似,支持8位、16位、32位操作,進行32位操作是,寄存器名稱前面冠以“E”。

    這八個寄存器的名稱如下:EAX(累加器)、EBX(基址)、ECX(計數)、EDX(數據)、ESP(棧指針)、EBP(基址指針)、ESI(源變址)、EDI(目的變址)。

二、段寄存器

    80386比8086/80286增加了兩個段寄存器FS、GS。

    除CS支持代碼段,SS支持堆棧段外,程序員可以利用其它的所有段寄存器支持數據段。

    每個段寄存器對應這一個64位高速緩存器(有些資料中說有96位,但值使用其中的64位),這在8086中是沒有的(在80286中爲48位),它的具體作用將另文介紹。

三、指令指針寄存器和標誌寄存器

    指令寄存器EIP是對8086/80286指令指針寄存器的32位擴展,它包含着待執行指令的32位偏移量,該值總是相對CS所代表的段基址而言的。

    標誌寄存器也是對8086/80286標誌寄存器的32位擴展,其定義如下(這張圖截自Intel關於IA32架構的最新文檔):

80386的寄存器組成 - whowin - DOS編程技術

    其中OF、DF、IF、TF、SF、ZF、AF、PF和CF在8086中就已經存在,請參考相關資料。

    IOPL(I/O Privilege Level)是從80286開始出現的,佔2個bit表示I/O特權級,如果當前特權級小於或等於IOPL,則可以執行I/O操作,否則將出現一個保護性異常。IOPL只能由特權級爲0的程序或任務來修改。

    NT(Nested Task)也是從80286開始出現的,表示嵌套任務,用於控制中斷返回指令IRET,當NT=0時,用堆棧中保存的值恢復EFLAGS、CS和EIP,從而實現返回;若NT=1,則通過任務切換實現中斷返回。

    下面的標誌位是80386以後的CPU纔有的標誌。

    VM(Virtual-8086 mode)表示虛擬8086模式,如果VM被置位且80386已出於保護模式下,則CPU切換到虛擬8086模式,此時,對段的任何操作又回到了實模式,如同在8086下運行一樣。

    RF(Resume flag)表示恢復標誌(也叫重啓標誌),與調試寄存器一起用於斷點和單步操作,當RF=1 時,下一條指令的任何調試故障將被忽略,不產生異常中斷。當RF=0時,調試故障被接受,併產生異常中斷。用於調試失敗後,強迫程序恢復執行,在成功執行每條指令後,RF自動復位。

    AC(Alignment check)表示對齊檢查。這個標誌是80486以後的CPU纔有的。當AC=1且CR0中的AM=1時,允許存儲器進行地址對齊檢查,若發現地址未對齊,將產生異常中斷。所謂地址對齊,是指當訪問一個字(2字節長)時,其地址必須是偶數(2的倍數),當訪問雙字(4字節長)時,其地址必須是4的倍數。

    但是隻有運行在特權級3的程序才執行地址對齊檢查,特權級0、1、2忽略該標誌。

    VIF(Virtual interrupt flag)表示虛擬中斷標誌。以下的三個標誌是Pentium以後的CPU纔有的。當VIF=1時,可以使用虛擬中斷,當VIF=0時不能使用虛擬中斷。該標誌要和下面的VIP和CR4中的VME配合使用。

    VIP(Virtual interrupt pending flag)表示虛擬中斷掛起標誌。當VIP=1時,VIF有效,VIP=0時VIF無效。

    ID(Identification flag)表示鑑別標誌。該標誌用來只是Pentium CPU是否支持CPUID的指令。

    實際上,如果不編寫操作系統,大部分標誌可能很難得用到一次,有個印象就好了,用到了再去查不遲。

四、系統表寄存器

    80386 中有4個系統表寄存器,分別是全局描述符表寄存器(GDTR)、中斷描述符表寄存器(IDTR)、局部描述符表寄存器(LDTR)、任務狀態寄存器(TR)。系統表寄存器用於在保護方式下,管理4 個系統表,由於只能在保護方式下使用,因此又稱爲保護方式寄存器。有關描述附表的問題,另文介紹。

五、控制寄存器

    80386的控制寄存器有4個,其中CR1保留以後使用,從Pentium開始,又增加了一個CR4,CR0的低16位包含了與80286的MSW一致的位定義,保持了和80286的兼容,同時也兼容了從80286開始的兩條指令LMSW/SMSW,其基本定義如下:

80386的寄存器組成 - whowin - DOS編程技術

    CR0中各位含義如下

  • PE(Protection Enable)保護模式允許,PE=0表示CPU工作在實模式,PE=1表示CPU工作在保護模式
  • MP(Monitor Coprocessor)監控協處理器,MP=1表示協處理器在工作,MP=0表示協處理器未工作。
  • EM(Emulation)協處理器仿真,當MP=0,EM=1時,表示正在使用軟件仿真協處理器工作。
  • TS(Task Switched)任務轉換,每當進行任務轉換時,TS=1,任務轉換完畢,TS=0。TS=1時不允許協處理器工作。
    以上4個定義從80286開始,下面的2個定義從80386開始存在
  • ET(Extension Type)處理器擴展類型,反映了所擴展的協處理器的類型,ET=0爲80287,ET=1爲80387。
  • PG(Paging)頁式管理機制使能,PG=1時頁式管理機制工作,否則不工作。

    從80486開始又增加了如下位定義。

  • NE(Numeric Error)數值異常中斷控制,NE=1時,如果運行協處理器指令發生故障,則用異常中斷處理,NE=0時,則用外部中斷處理。
  • WP(Write Protect)寫保護,當WP=1時,對只讀頁面進行寫操作會產生頁故障。
  • AM(Alignment Mask)對齊標誌,AM=1時,允許對齊檢查,AM=0時不允許,關於對齊,在EFLAGS的AC標誌時介紹過,在80486以後的CPU中,CPU進行對齊檢查需要滿足三個條件,AC=1、AM=1並且當前特權級爲3。
  • NW(Not Write-through)和CD(Cache Disable),這兩個標誌都是用來控制CPU內部的CACHE的,當NW=0且CD=0時,CACHE使能,其它的組合說起來比較複雜,如果有讀者真的想搞清楚的話,可以參閱《Intel? 64 and IA-32 Architectures》中的“Software Developer’s Manual Volume 3A”這一冊,在第10章對這兩個標誌的各種組合有比較詳細的說明。
    CR1保留未用;CR2存放引起頁故障的線性地址,只有在PG=1時,CR2纔有效,當頁故障處理程序被激活時,壓入頁故障處理程序堆棧中的錯誤碼提供頁故障的狀態信息。
    CR3的bit12--bit31存放頁目錄的基地址,因爲也目錄總是頁對齊的(一頁爲4K),所以頁目錄基地址從bit12開始就可以了。只有當CR0中的PG=1時,CR3的頁目錄基地址纔有效。
    從80486開始,在CR3的低12位定義了兩個控制位,如下
  • PCD(Page-level Cache Disable)頁CACHE禁止,當PCD=0時,頁目錄表進行高速緩存,PCD=1時,不進行高速緩存;該位控制PCD引腳控制外部CACHE工作還是不工作。
  • PWT(Page-level Writes Transparent),CACHE的寫入分爲透寫(Write-Through)和回寫(Write-Back),80486以上的CPU內部的CACHE都是透寫的,但對外部CACHE而言,允許某些頁是回寫的,而另一些頁是透寫的,當PWT=1時,外部CACHE對頁目錄進行透寫,否則進行回寫;此位驅動PWT引腳以控制外部CACHE是透寫還是回寫。
    CR4是從Pentium CPU開始出現的
  • VME(Virtual-8086 Mode Extensions)虛擬8086方式擴展,VME=1允許使用虛擬8086擴展模式,否則只能使用80386/80486的虛擬8086模式。
  • PVI(Protected-Mode Virtual Interrupts)保護模式虛擬中斷,PVI=1時,在保護模式下支持虛擬中斷標誌VIF(EFLAGS中),PVI=0則不支持虛擬中斷標誌。
  • TSD(Time Stamp Disable)時間戳禁止,TSD=1時,允許在特權級爲0的程序中執行RDTSC指令(讀時間戳計數指令),TSD=0時,允許任何特權級執行RDTSC指令。
  • DE(Debugging Extensions)調試擴展,
  • PSE(Page Size Extensions)頁大小擴展,PSE=1時,頁大小可以擴展到2M或4M,PSE=0時,頁大小隻能是4K.
  • PAE(Physical Address Extension)物理地址擴展,PAE=1時,頁物理地址可以擴展到36bits以上,PAE=0時只能用32bits的物理地址。
  • MCE(Machine-Check Enable)硬件檢查使能,Pentium以後的CPU有一種硬件檢測功能,MCE=1時允許使用該功能。
  • PGE(Page Global Enable)全局頁使能,PGE=1時,允許使用全局頁,PGE=0時禁止使用全局頁。
  • PCE(Performance-Monitoring Counter Enable)性能監視計數器使能,當PCE=1時,允許在任何保護級下執行RDPMC指令,PCE=0時,只有特權級0的程序可以執行RDPMC指令。
  • OSFXSR(Operating System Support for FXSAVE and FXRSTOR instructions)
  • OSXMMEXCPT(Operating System Support for Unmasked SIMD Floating-Point Exceptions)
  • VMXE(VMX-Enable Bit)VMX使能位,VMXE=1時,允許VMX操作。
  • SMXE(SMX-Enable Bit)SMX使能位,SMXE=1時,允許SMX操作。
  • OSXSAVE(XSAVE and Processor Extended States-Enable Bit)  

六、調試寄存器

    一共有8個調試寄存器DR0--DR7,DR0-DR3可以分別設置4個斷點的線性地址,DR4-DR5保留未用,DR6是斷點狀態寄存器,DR7是斷點控制寄存器(包括斷點類型、斷點長度,斷點開放/禁止)

七、測試寄存器

    一共有8個測試寄存器TR0--TR7,TR0-TR2保留,TR3-TR5用作CACHE測試,TR6爲命令測試寄存器,TR7爲測試數據寄存器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章