User:Johnburger/Demo/x86/EFlags

From OSDev Wiki
Jump to navigation Jump to search

Personally, I prefer Borland's TASM and Microsoft's MASM syntax for bitfields: you can define a RECORD for a bitfield, and then each individual bit or range of bits are accessible through the use of keywords like SHIFT, MASK and WIDTH to reference the fields.

You want to isolate x86.EFlags.IOPL?

x86.EFlags      RECORD
                .NT : 1         ; Nested Task Flag
                .IOPL : 2       ; I/O Privilege Level
                .OF : 1         ; Parity Flag
                .DF : 1         ; Direction Flag
                .IF : 1         ; Interrupt Flag
                .TF : 1         ; Trace Flag
                .SF : 1         ; Sign Flag
                .ZF : 1         ; Zero Flag
                    : 1         ; Reserved
                .AF : 1         ; Arithmetic Flag
                .0  : 1         ; Always 0
                .PF : 1         ; Parity Flag
                .1  : 1         ; Always 1
                .CF : 1         ; Carry Flag
x86.EFlags      ENDS

                PUSHFD
                POP             EAX
                AND             EAX,MASK x86.EFlags.IOPL
                SHR             EAX,SHIFT x86.EFlags.IOPL
                MOV             CL,WIDTH x86.EFlags.IOPL

(Of course, I've muddied the example by using NASM's sophisticated local-label syntax that TASM doesn't support, and I've used a non-supported "missing bit" syntax extension...)

I've seen posts asking why the whole RECORD, MASK, SHIFT, and WIDTH infrastructure exists: THIS is why! NASM doesn't support the keywords: I miss them...

Demo/x86/EFlags.inc

;
; x86/EFlags.inc
;

; The following are the bitfields in the EFlags register
x86.EFlags.ID   EQU             0000_0000_0010_0000_0000_0000_0000_0000b
x86.EFlags.VIP  EQU             0000_0000_0001_0000_0000_0000_0000_0000b
x86.EFlags.VIF  EQU             0000_0000_0000_1000_0000_0000_0000_0000b
x86.EFlags.AC   EQU             0000_0000_0000_0100_0000_0000_0000_0000b
x86.EFlags.VM   EQU             0000_0000_0000_0010_0000_0000_0000_0000b
x86.EFlags.RF   EQU             0000_0000_0000_0001_0000_0000_0000_0000b
x86.EFlags.NT   EQU             0000_0000_0000_0000_0100_0000_0000_0000b
x86.EFlags.IOPL EQU             0000_0000_0000_0000_0011_0000_0000_0000b
x86.EFlags.OF   EQU             0000_0000_0000_0000_0000_1000_0000_0000b
x86.EFlags.DF   EQU             0000_0000_0000_0000_0000_0100_0000_0000b
x86.EFlags.IF   EQU             0000_0000_0000_0000_0000_0010_0000_0000b
x86.EFlags.TF   EQU             0000_0000_0000_0000_0000_0001_0000_0000b
x86.EFlags.SF   EQU             0000_0000_0000_0000_0000_0000_1000_0000b
x86.EFlags.ZF   EQU             0000_0000_0000_0000_0000_0000_0100_0000b
x86.EFlags.AF   EQU             0000_0000_0000_0000_0000_0000_0001_0000b
x86.EFlags.PF   EQU             0000_0000_0000_0000_0000_0000_0000_0100b
x86.EFlags.1    EQU             0000_0000_0000_0000_0000_0000_0000_0010b
x86.EFlags.CF   EQU             0000_0000_0000_0000_0000_0000_0000_0001b