原文地址:http://blog.csdn.net/jn1158359135/article/details/7761011
app
鑑於EFLAGS寄存器的重要性,因此將這一部份內容從處理器體系結構及尋址模式一文中單獨抽出另成一文,這部份內容主要來自Intel Developer Mannual,在後續的內核系列中遇到的許多和EFLAGS寄存器有關的內容將直接從本文引用。衆所周知,IA-32體系結構爲通用系統(general system)提供了16個基本的程序執行寄存器:包含一些通用目的寄存器(General-purpose registers)、段寄存器(Segment registers)以及EFLAGS和EIP寄存器,然後二者對於程序的執行來講可謂相當重要。 this
其中EIP寄存器主要用於存放當前代碼段即將被執行的下一條指令的偏移,但其本質上並 不能直接被指令直接訪問。 【it is controlled implicitly by control-transfer instructions (such as JMP, Jcc, CALL, and RET), interrupts, and exceptions.】 很顯然,這個寄存器指令由控制轉移指令、中斷及異常所控制。 【The only way to read the EIP register is to execute a CALL instruction and then read the value of the return instruction pointer from the procedure stack.The EIP register can be loaded indirectly by modifying the value of a return instruction pointer on the procedure stack and executing a return instruction (RET or IRET)】 這裏也已經說的很清楚了,讀操做經過執行call指令並取得棧中所存放的地址來實現,而寫操做則經過修改程序棧中的返回指令指針並執行RET/IRET指 令來完成,所以儘管這個寄存器至關重要,但其實並非操做系統在實現過程當中所需關注的焦點。 spa
相對來說,EFLAGS寄存器對於操做系統則重要得多。EFLAGS(program status and control) register主要用於提供程序的狀態及進行相應的控制, 【The EFLGAS register report on the status of the program being executed and allows limited(application-program level) control of the process.】 在64-bit模式下,EFLGAS寄存器被擴展爲64位的RFLGAS寄存器,高32位被保留,而低32位則與EFLAGS寄存器相同。 操作系統
32位的EFLAGS寄存器包含一組狀態標誌、系統標誌以及一個控制標誌。在x86處理器初始化以後,EFLAGS寄存器的狀態值爲0000 0002H。 第一、三、五、15以及22到31位均被保留,這個寄存器中的有些標誌經過使用特殊的通用指令能夠直接被修改,但並無指令可以檢查或者修改整個寄存器。 經過使用LAHF/SAHF/PUSHF/POPF/POPFD等指令,能夠將EFLAGS寄存器的標誌位成組移到程序棧或EAX寄存器,或者從這些設施 中將操做後的結果保存到EFLAGS寄存器中。在EFLAGS寄存器的內容被傳送到棧或是EAX寄存器後,能夠經過位操做指令(BT, BTS, BTR, BTC)檢查或修改這些標誌位。當調用中斷或異常處理程序時,處理器將在程序棧上自動保存EFLAGS的狀態值。若 在中斷或異常處理時發生任務切換,那麼EFLAGS寄存器的狀態將被保存在TSS中 【the state of the EFLAGS register is saved in the TSS for the task being suspended.】 ,注意是將要被掛起的本次任務的狀態。 .net
EFLAGS Register
指針
一、狀態標誌(Status Flags)
EFLAGS寄存器的狀態標誌(0、二、四、六、7以及11位)指示算術指令(如ADD, SUB, MUL以及DIV指令)的結果,這些狀態標誌的做用以下: 調試
在這些狀態標誌中,只有CF標誌可以經過使用STC, CLC以及CMC指令被直接修改,或者經過位指令(BT, BTS, BTR以及BTC)將指定的位拷貝至CF標誌中。 code
這些狀態標誌容許單個的算術操做產生三種不一樣數據類型的結果:無符號整型,有符號整型 以及BCD整型。若是把該結果當作無符號整型,那麼CF標誌指示越界(out-of-range)狀態——即進位或借位,若是被當作有符號整型,則OF標 志指示進位或借位,若做爲BCD數,那麼AF標誌指示進位或借位。SF標誌指示有符號整數的符號位,ZF指示結果爲零。此外在執行多倍精度算術運算時,CF標誌用來將一次運算過程當中帶進位的加法(ADC)或帶借位的減法(SBB)產生的進位或借位傳遞到下一次運算過程當中。 blog
二、DF標誌(DF flag)
這個方向標誌(位於EFLAGS寄存器的第10位)控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。設置DF標誌使得串指令自動遞減(從高地址向低地址方向處理字符串),清除該標誌則使得串指令自動遞增。STD以及CLD指令分 別用於設置以及清除DF標誌。 ip
三、系統標誌以及IOPL域(System Flags and IOPL Field)
EFLAGS寄存器中的這部分標誌用於控制操做系統或是執行操做,它們不容許被應用程序所修改。這些標誌的做用以下: