轉:x86—EFLAGS寄存器詳解

原文地址: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(bit 0) [Carry flag]   若算術操做產生的結果在最高有效位(most-significant bit)發生進位或借位則將其置1,反之清零。這個標誌指示無符號整型運算的溢出狀態,這個標誌一樣在多倍精度運算(multiple-precision arithmetic)中使用。

  • PF(bit 2) [Parity flag]   若是結果的最低有效字節(least-significant byte)包含偶數個1位則該位置1,不然清零。

  • AF(bit 4) [Adjust flag]   若是算術操做在結果的第3位發生進位或借位則將該標誌置1,不然清零。這個標誌在BCD(binary-code decimal)算術運算中被使用。

  • ZF(bit 6) [Zero flag]   若結果爲0則將其置1,反之清零。

  • SF(bit 7) [Sign flag]   該標誌被設置爲有符號整型的最高有效位。(0指示結果爲正,反之則爲負)

  • OF(bit 11) [Overflow flag]   若是整型結果是較大的正數或較小的負數,而且沒法匹配目的操做數時將該位置1,反之清零。這個標誌爲帶符號整型運算指示溢出狀態。

在這些狀態標誌中,只有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寄存器中的這部分標誌用於控制操做系統或是執行操做,它們不容許被應用程序所修改。這些標誌的做用以下:

    TF(bit 8) [Trap flag]   將該位設置爲1以容許單步調試模式,清零則禁用該模式。

  • IF(bit 9) [Interrupt enable flag]   該標誌用於控制處理器對可屏蔽中斷請求(maskable interrupt requests)的響應。置1以響應可屏蔽中斷,反之則禁止可屏蔽中斷。

  • IOPL(bits 12 and 13) [I/O privilege level field]   指示當前運行任務的I/O特權級(I/O privilege level),正在運行任務的當前特權級(CPL)必須小於或等於I/O特權級才能容許訪問I/O地址空間。這個域只能在CPL爲0時才能經過POPF以及IRET指令修改。

  • NT(bit 14) [Nested task flag]   這個標誌控制中斷鏈和被調用任務。若當前任務與前一個執行任務相關則置1,反之則清零。

  • RF(bit 16) [Resume flag]   控制處理器對調試異常的響應。

  • VM(bit 17) [Virtual-8086 mode flag]   置1以容許虛擬8086模式,清除則返回保護模式。

  • AC(bit 18) [Alignment check flag]   該標誌以及在CR0寄存器中的AM位置1時將容許內存引用的對齊檢查,以上兩個標誌中至少有一個被清零則禁用對齊檢查。
    VIF(bit 19) [Virtual interrupt flag]   該標誌是IF標誌的虛擬鏡像(Virtual image),與VIP標誌結合起來使用。使用這個標誌以及VIP標誌,並設置CR4控制寄存器中的VME標誌就能夠容許虛擬模式擴展(virtual mode extensions)

  • VIP(bit 20) [Virtual interrupt pending flag]   該位置1以指示一箇中斷正在被掛起,當沒有中斷掛起時該位清零。【Software sets and clears this flag; the processor only reads it.】與VIF標誌結合使用。

  • ID(bit 21) [Identification flag]   程序可以設置或清除這個標誌指示了處理器對CPUID指令的支持。
相關文章
相關標籤/搜索