User:Johnburger/Demo/x86/EFlags
From OSDev Wiki
< User:Johnburger | Demo
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