原作**:
寫這篇文章,完全是因為學習保護模式需要這些知識,讀者完全可以走馬觀花,大致看看有什麼內容,知道需要的時候來查這篇文章就可以了,完全沒有必要抵抗著睏意非要把這篇文章認真看完,記住裡面每乙個暫存器裡每一位的定義,但是以後的文章如果需要,一定要記得回來查查相關的內容。
80386共提供7種型別的32位暫存器,如下:
通用暫存器(eax、ebx、ecx、edx、esp、ebp、esi、edi)
段暫存器(cs、ss、ds、es、fs、gs)
指令指標暫存器和標誌暫存器(eip、eflags)
系統表暫存器(gdtr、idtr、ldtr、tr)
控制暫存器(cr0、cr1、cr2、cr3、cr4)
除錯暫存器(dr0、dr1、dr2、dr3、dr4、dr5、dr6、dr7)
測試暫存器(tr6、tr7)
其中後三類暫存器是80386以後的cpu才有的,以前的cpu完全沒有。
下圖是前四類暫存器的大致示意圖:
本文只對這些暫存器做乙個大致的介紹,其中有些特殊且有較大意義的暫存器,會另文介紹。
一、通用暫存器
一組八個通用暫存器是對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架構的最新文件):
其中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,其基本定義如下:
cr0中各位含義如下:
以上4個定義從80286開始,下面的2個定義從80386開始存在
從80486開始又增加了如下位定義。
cr1保留未用;cr2存放引起頁故障的線性位址,只有在pg=1時,cr2才有效,當頁故障處理程式被啟用時,壓入頁故障處理程式堆疊中的錯誤碼提供頁故障的狀態資訊。
cr3的bit12--bit31存放頁目錄的基位址,因為也目錄總是頁對齊的(一頁為4k),所以頁目錄基位址從bit12開始就可以了。只有當cr0中的pg=1時,cr3的頁目錄基位址才有效。
從80486開始,在cr3的低12位定義了兩個控制位,如下:
cr4是從pentium cpu開始出現的。
六、除錯暫存器
一共有8個除錯暫存器dr0--dr7,dr0-dr3可以分別設定4個斷點的線性位址,dr4-dr5保留未用,dr6是斷點狀態暫存器,dr7是斷點控制暫存器(包括斷點型別、斷點長度,斷點開放/禁止)
七、測試暫存器
一共有8個測試暫存器tr0--tr7,tr0-tr2保留,tr3-tr5用作cache測試,tr6為命令測試暫存器,tr7為測試資料暫存器。
80386的暫存器組成
寫這篇文章,完全是因為學習保護模式需要這些知識,讀者完全可以走馬觀花,大致看看有什麼內容,知道需要的時候來查這篇文章就可以了,完全沒有必要抵抗著睏意非要把這篇文章認真看完,記住裡面每乙個暫存器裡每一位的定義,但是以後的文章如果需要,一定要記得回來查查相關的內容。80386共提供7種型別的32位暫存器...
80386控制暫存器
控制暫存器 80386有4個32位控制暫存器,分別命名為cr0 cr1 cr2 cr3。但cr1被保留,供今後開發的處理器使用,在80386中不能使用cr1,否則將引起無效指令操作異常。cr0包含指示處理器工作方式的控制位,包含啟用和禁用分頁管理機制的控制位,包含控制浮點協處理器操作的控制位。cr2...
80386的暫存器 摘
80386的暫存器可以分為8組 通用暫存器,段暫存器,指令指標暫存器,標誌暫存器,系統位址暫存器,控制暫存器,除錯暫存器,測試暫存器,它們的寬度都是32位的。本篇主要介紹80386的暫存器。a1.general register 通用暫存器 eax,ebx,ecx,edx,esi,edi,esp,e...