32位x86處理器操作模式和寄存器簡介


①操作模式

一.實模式(Real Mode)

  實模式實現的是早期Intel處理器的編程環境,內存尋址方式和8086相同,由16位段寄存器的內容乘以16(10H)當做棧基地址,再加上16位偏移地址形成20位的物理地址,最大尋址空間1MB,最大分段64KB。實模式下可以使用32位指令,且所有的段都是可讀、可寫和可執行的。

   當CPU復位或加點,即電腦重啟或開機時,CPU以實模式啟動、工作。然而只有在CPU剛剛啟動時為實模式,等到操作系統運行后便運行在保護模式下。

二.保護模式(Protected Mode)

  保護模式為處理器的原生狀態,在該模式下所有的指令和特性都是可用的。並且程序會被分配一個獨立內存區域,稱之為段,而處理器會阻止程序使用自身范圍之外的內存。在保護模式下,段值雖然與實模式下相同而然為16位,但其意義發生了改變,它變成了一個索引,指向一個數據結構的表項,根據這個數據結構,保護模式獲得了實模式下沒有的強大的尋址能力(留坑,以后補充)。借此,保護模式尋址采用了32位段和偏移量,最大尋址空間4GB(P6處理器開始,最大物理內存空間增加到64GB),最大分段4GB(Pentium Pre及以后為64GB)。

三.虛擬8086模式(Virtual-8086 Mode)

   在保護模式下,CPU可以在一個安全環境中直接運行實模式軟件,如MS-DOS程序。嚴格來說,虛擬8086模擬可以看作是保護模式下的一個屬性。虛擬8086模式的內存尋址方式、最大尋址空間和最大分段都與實模式相同,其主要作用便是為了在保護模式下兼容以前的實模式應用。現代操作系統可以同時執行多個獨立的虛擬8086會話。

四.系統管理模式(System Management Mode)

   SMM是一個對所有Intel處理器都同意的標准體系結構特性,該模式向操作系統提供了實現諸如電源管理和系統安全等功能的機制。通俗等講,Intel在它的CPU中專門留了個模式叫SSM,該模式擁有最高權限,當SMM中斷時,操作系統無法獲知,而在該模式下Intel便可以對CPU進行Debug,從而修復BUG。

②基本寄存器

一.數據寄存器

   32位CPU下有4個數據寄存器,分別是EAX、EBX、ECX和EDX。其中E的意思為擴展(Extended),對應的為8086中的16位寄存器,如AX、BX等。

   EAX(Accumulator Register):常稱為累加器,加法、乘除指令默認使用EAX,常用於存放各種計算結果,使用的頻率非常高。

   EBX(Base Register):稱為基地址寄存器,用於內存尋址時存放基地址,也可用於存儲器指針。

   ECX(Count Register):CPU默認使用ECX為循環計數器,用於控制循環(Loop)次數。

   EDX(Date Register):在進行乘除運算時,它可以作為默認的操作數參與運算,同時被用於保存乘法形成的部分結果或除法之前部分被除數。整數除法的余數也總是存放在EDX中。

 

二.變址寄存器

  32位CPU下有兩個變址寄存器,分別是ESI和EDI,對應16位中的SI和DI,但對低16位數據的存取等操作並不會影響高16位的數據內容。

  ESI(Source Index):稱為源變址寄存器,通常用於存放要處理的數據的內存地址。同時當進行例如循環一個數組求和時,ESI會充當指針用於遍歷數組。

   EDI(Destination Index):稱為目的變址寄存器,通常用於存放處理后的數據的內存地址。

  以下為實例代碼:

.386
.model flat, stdcall
.stack
ExitProcess PROTO, dwExitCode:DWORD
.data
arrayD DWORD 10000h, 20000h, 30000h ;定義一個雙字數組
.code
main PROC
mov eax, 0 ;將eax置零
mov esi, OFFSET arrayD ;獲取arrayD的地址,並賦值給esi
add eax, [esi]
add esi, TYPE arrayD ;使esi指向下一個arrayD的元素
add eax, [esi]
add esi, TYPE arrayD
add eax, [esi] ;此時eax = 6000h,為arrayD數組中的和

INVOKE ExitProcess, 0

main ENDP
END main

 
###三.指針寄存器
####  32位CPU有兩個指針寄存器,分別是EBP和ESP,對應16位中的SBP和SP。指針寄存器不同於AH,AL,不可被分割為8位寄存器。
####  EBP(Base Pointer && Frame Pointer):EBP用於引用堆棧中的函數參數和局部變量,指向當前活動記錄的底部,通過EBP使得訪問函數的參數變得很容易。任何函數調用后都需要保護調用者的幀指針,以便調用完成后可以恢復調用者的幀指針。
####  ESP(Stack Pointer):ESP用於堆棧指針,它指向當前堆棧的棧頂位置。

push ebp ;訪問函數
mov esp ebp

... ;函數執行過程

mov ebp, esp
pop ebp ;返回函數

 
###四.段寄存器
####  32位CPU下有六個段寄存器,它們分別有不同的功能。
#### 
####  CS——代碼段寄存器(Code Segment Register),其值為代碼段的段值。
####  DS——數據段寄存器(Data Segment Register),其值為數據段的段值。
####  ES——附加段寄存器(Extra Segment Register),其值為附加數據段的段值。
####  SS——堆棧段寄存器(Stack Segment Register),其值為堆棧段的段值。
####  FS——附加段寄存器(Extra Segment Register),其值為附加數據段的段值。
####  GS——附加段寄存器(Extra Segment Register),其值為附加數據段的段值。 
 
####  實地址模式下,16位段寄存器表示的是預先分配的內存區域的基址,要訪問某內存段內的數據,必須使用該段寄存器和存儲單元的偏移量,內存單元的邏輯地址為 “段值:偏移量”的形式。
####  保護模式下,段寄存器中保存的是段描述表指針。而一些段中存放着程序指令(.code段),一些段中存放着變量(.data段),還有一個堆棧段存放的是局部函數變量和函數參數。
 
###五.指令寄存器
####  32位CPU下將指令寄存器擴展到了16位,對應16位中的IP,32位下的指令寄存器為EIP(Instruction Pointer)。EIP中包含下一條將要執行指令的地址,某些機器指令(如jmp)能夠控制EIP,使得程序分支轉到一個新位置。
 
###六.標志寄存器
####  1.進位標志位(Carry Flag && CF):當無符號數的計算結果超出其范圍時,CF被置為1, 否則CF被置為0。
####  2.溢出標志位(Overflow Flag && OV):當有符號數的計算結果超出其范圍時,OV被置為1,否則OV被置為0。
####  3.符號標志位(Sign Flag && SF):算術或邏輯操作產生負結果時,SF被置為1,否則SF被置為0。
####  4.零標志位(Zero Flag && ZF):算數或邏輯結果產生的結果為零時,ZF被置為1,否則ZF被置為0。
####  5.輔助進位標志位(Auxiliary Carry Flag && AC):運算時若最低的四位產生了進位,那么AC被置為1,否則AC被置為0。
####  6.奇偶校驗標志位(Parity Flag):目標操作數最低有效字節中的1的個數為偶數時,PF被置為1,否則PF被置為0。
 
###七.EFLAGS(另外開坑)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM