Bit format, cpuid bits hmm whats the diff 0-7 bit and how do i access it?

Started by marco1974, March 08, 2005, 06:17:04 AM

Previous topic - Next topic

marco1974

Quote from: Greg on March 09, 2005, 10:57:55 PM
You can also use RECORD and MASK. Read about it in the MASM Programmers Guide. I have an example of using them if you would like to see one.

Yeah i would surely like that!

GregL

An example of using RECORD and MASK, not quite as handy as Bit Fields in C, but simplifies the process of using AND and SHR.


; CPUID.asm
; /SUBSYSTEM:CONSOLE
; Greg Lyon

.586
.model flat, stdcall
option casemap:none

;-------------------------------------------------
; Includes
;-------------------------------------------------
include windows.inc

include kernel32.inc
include masm32.inc
;include gel32.inc

includelib kernel32.lib
includelib masm32.lib
;includelib gel32.lib

;-------------------------------------------------
; Equates
;-------------------------------------------------
Cr                 EQU 13
Lf                 EQU 10

BLACK              EQU  0
BLUE               EQU  1
GREEN              EQU  2
CYAN               EQU  3
RED                EQU  4
MAGENTA            EQU  5
BROWN              EQU  6
LIGHTGRAY          EQU  7
DARKGRAY           EQU  8
LIGHTBLUE          EQU  9
LIGHTGREEN         EQU 10
LIGHTCYAN          EQU 11
LIGHTRED           EQU 12
LIGHTMAGENTA       EQU 13
YELLOW             EQU 14
WHITE              EQU 15
DEFAULT            EQU LIGHTGRAY

;-------------------------------------------------
; Records
;-------------------------------------------------

EAX_REC_1          RECORD \ 
                   b28_31a  : 4,    ; bit 28-31
                   ExtFam   : 8,    ; bit 20-27
                   ExtMod   : 4,    ; bit 16-19
                   b14_15a  : 2,    ; bit 14-15
                   ProcType : 2,    ; bit 12-13
                   Family   : 4,    ; bit 8-11
                   Model    : 4,    ; bit 4-7
                   Stepping : 4     ; bit 0-3
                 
EBX_REC_1          RECORD \
                   b8_31c   : 24,   ; bit 8-31
                   BrandID  :  8    ; bit 0-7
                                 
ECX_REC_1          RECORD \
                   b1_30c   : 31,   ; bit 1-30                                         
                   SSE3     : 1     ; bit 0
                 
EDX_REC_1          RECORD \ 
                   b27_31d  : 5,    ; bit 27-31
                   SSE2     : 1,    ; bit 26
                   SSE      : 1,    ; bit 25
                   b24d     : 1,    ; bit 24
                   MMX      : 1,    ; bit 23
                   b1_22d   : 22,   ; bit 1-22
                   FPU      : 1     ; bit 0
                   
;-------------------------------------------------
; Macros
;-------------------------------------------------
Color MACRO val:=<DEFAULT>
 
    cmp dwGotStdOutHandle, 0
    jne @F
        INVOKE GetStdHandle, STD_OUTPUT_HANDLE
        mov hStdOut, eax
        mov dwGotStdOutHandle, -1
    @@:           
    INVOKE SetConsoleTextAttribute, hStdOut, val
                                     
ENDM   

;-------------------------------------------------
    .DATA 
   
        Eax1       EAX_REC_1 <0>
        Ebx1       EBX_REC_1 <0>
        Ecx1       ECX_REC_1 <0>
        Edx1       EDX_REC_1 <0>
       
        dwMaxLevel DWORD 0
        dwProcSig  DWORD 0
        dwBrandID  DWORD 0
        dwGotStdOutHandle SDWORD  0
        hStdOut    DWORD   0   
       
        szBuf      BYTE 256 dup(?) 
         
        BrandStr   BYTE 48 dup(0)
        VendorStr  BYTE 13 dup (0)
                           
        szTitle    BYTE "CPUID", 0                       
        szNoCPUID  BYTE " Error: This CPU does not support the CPUID instruction.", 0                       
        szPak      BYTE "Press any key to continue...", 0   
       
        szBrandStr BYTE " Brand string:        ", 0           
        szBrandID  BYTE " Brand ID:            ", 0
                           
        szVendor   BYTE " Vendor ID string:    ", 0
        szMaxLevel BYTE " Maximum CPUID level: ", 0
        szStepping BYTE " Stepping:            ", 0
        szModel    BYTE " Model:               ", 0
        szFamily   BYTE " Family:              ", 0
        szProcType BYTE " Processor type:      ", 0
        szExtMod   BYTE " Extended model:      ", 0
        szExtFam   BYTE " Extended family:     ", 0
        szFPU      BYTE " FPU:                 ", 0   
        szMMX      BYTE " MMX:                 ", 0
        szSSE      BYTE " SSE:                 ", 0
        szSSE2     BYTE " SSE2:                ", 0
        szSSE3     BYTE " SSE3:                ", 0
       
        sz01h      BYTE "Intel Celeron processor", 0
        sz02h      BYTE "Intel Pentium III processor", 0
        sz03h      BYTE "Intel Pentium III Xeon processor", 0 
        sz6B1h     BYTE "Intel Celeron processor", 0
        sz04h      BYTE "Intel Pentium III processor", 0
        sz06h      BYTE "Mobile Intel Pentium III Processor M", 0
        sz07h      BYTE "Mobile Intel Celeron processor", 0
        sz08h      BYTE "Intel Pentium 4 processor", 0
        szF138h    BYTE "Intel Genuine processor", 0
        sz09h      BYTE "Intel Pentium 4 processor", 0
        sz0Ah      BYTE "Intel Celeron Processor", 0
        sz0Bh      BYTE "Intel Xeon processor", 0
        szF13Bh    BYTE "Intel Xeon processor MP", 0
        sz0Ch      BYTE "Intel Xeon processor MP", 0
        sz0Eh      BYTE "Mobile Intel Pentium 4 processor M", 0
        szF13Eh    BYTE "Intel Xeon processor", 0
        sz0Fh      BYTE "Mobile Intel Celeron Processor", 0
        szUnknown  BYTE "Unknown", 0
               
        szNotSupp  BYTE "Not supported", 0       
        szYes      BYTE "Yes", 0
        szNo       BYTE "No", 0
        szCrLf     BYTE Cr, Lf, 0

;-------------------------------------------------                         
    .CODE
   
start:

    invoke StdOut, ADDR szTitle
    invoke StdOut, ADDR szCrLf
    invoke StdOut, ADDR szCrLf
    ;------------------------------------
    ; Check for CPUID instruction support
    ;------------------------------------
    pushfd
    pop     eax
    xor     eax, 00200000h  ; flip bit 21
    push    eax
    popfd
    pushfd
    pop     ecx
    xor     eax, ecx        ; check if bit 21 was flipped
    jz      cpuid_supported
    jmp     no_cpuid           
       
cpuid_supported:

    ;------------------------------------
    ; Check for Brand String support
    ;------------------------------------
    invoke StdOut, ADDR szBrandStr
   
    mov eax, 80000000h
    cpuid
   
    .IF eax > 80000000h     
        ; Brand String is supported
        mov eax, 80000002h
        mov dword ptr [BrandStr+ 0], eax
        mov dword ptr [BrandStr+ 4], ebx
        mov dword ptr [BrandStr+ 8], ecx
        mov dword ptr [BrandStr+12], edx
        mov eax, 80000003h
        mov dword ptr [BrandStr+16], eax
        mov dword ptr [BrandStr+20], ebx
        mov dword ptr [BrandStr+24], ecx
        mov dword ptr [BrandStr+28], edx
        mov eax, 80000004h
        mov dword ptr [BrandStr+32], eax
        mov dword ptr [BrandStr+36], ebx
        mov dword ptr [BrandStr+40], ecx
        mov dword ptr [BrandStr+44], edx
                     
        invoke StdOut, ADDR BrandStr
                               
    .ELSE
        Color DARKGRAY
        invoke StdOut, ADDR szNotSupp
        Color LIGHTGRAY
       
    .ENDIF
     
     invoke StdOut, ADDR szCrLf   
   
    ;------------------------------------
    ; Check for Brand ID support
    ;------------------------------------
    invoke StdOut, ADDR szBrandID
    mov eax, 1
    cpuid
   
    mov dwProcSig, eax
    mov Ebx1, ebx
   
    mov eax, Ebx1
    and eax, MASK BrandID
    shr eax, BrandID
    .IF eax != 0
   
        ; Brand ID is supported
        mov dwBrandID, eax
           
        .IF dwBrandID == 01h
            invoke StdOut, ADDR sz01h
        .ELSEIF dwBrandID == 02h
            invoke StdOut, ADDR sz02h
        .ELSEIF dwBrandID == 03h
            .IF dwProcSig == 000006B1h
                invoke StdOut, ADDR sz6B1h
            .ELSE   
                invoke StdOut, ADDR sz03h
            .ENDIF   
        .ELSEIF dwBrandID == 04h
            invoke StdOut, ADDR sz04h
        .ELSEIF dwBrandID == 06h
            invoke StdOut, ADDR sz06h
        .ELSEIF dwBrandID == 07h
            invoke StdOut, ADDR sz07h
        .ELSEIF dwBrandID == 08h
            .IF dwProcSig == 00000F13h
                invoke StdOut, ADDR szF138h
            .ELSE
                invoke StdOut, ADDR sz08h
            .ENDIF   
        .ELSEIF dwBrandID == 09h
            invoke StdOut, ADDR sz09h
        .ELSEIF dwBrandID == 0Ah
            invoke StdOut, ADDR sz0Ah
        .ELSEIF dwBrandID == 0Bh
            .IF dwProcSig == 00000F13h
                invoke StdOut, ADDR szF13Bh
            .ELSE
                invoke StdOut, ADDR sz0Bh
            .ENDIF   
        .ELSEIF dwBrandID == 0Ch
            invoke StdOut, ADDR sz0Ch
        .ELSEIF dwBrandID == 0Eh
            .IF dwProcSig == 00000F13h
                invoke StdOut, ADDR szF13Eh
            .ELSE
                invoke StdOut, ADDR sz0Eh
            .ENDIF   
        .ELSEIF dwBrandID == 0Fh
            invoke StdOut, ADDR sz0Fh
        .ELSE
            invoke StdOut, ADDR szUnknown
        .ENDIF

    .ELSE
   
        Color DARKGRAY
        invoke StdOut, ADDR szNotSupp
        Color LIGHTGRAY
       
    .ENDIF
   
    invoke StdOut, ADDR szCrLf       
                       
    ;------------------------------
    ; CPUID Level 0
    ;------------------------------
    xor   eax, eax 
    cpuid           
 
    mov   dwMaxLevel, eax 
         
    ; Save vendor string, "GenuineIntel" or "AuthenticAMD"
    mov dword ptr [VendorStr+0], ebx   ; "Genu"
    mov dword ptr [VendorStr+4], edx   ; "ineI"
    mov dword ptr [VendorStr+8], ecx   ; "ntel"
       
    invoke StdOut, ADDR szVendor
    invoke StdOut, ADDR VendorStr
    invoke StdOut, ADDR szCrLf   
   
    invoke dwtoa, dwMaxLevel, ADDR szBuf
    invoke StdOut, ADDR szMaxLevel
    invoke StdOut, ADDR szBuf   
    invoke StdOut, ADDR szCrLf 
           
    ;------------------------------
    ; CPUID Level 1
    ;------------------------------
    mov eax, 1
    cpuid
         
    mov Eax1, eax
    mov Ebx1, ebx
    mov Ecx1, ecx
    mov Edx1, edx
    ;------------------------------
    mov eax, Eax1
    and eax, MASK Stepping
    shr eax, Stepping
    invoke dwtoa, eax, ADDR szBuf
    invoke StdOut, ADDR szStepping
    invoke StdOut, ADDR szBuf
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    mov eax, Eax1
    and eax, MASK Model
    shr eax, Model
    invoke dwtoa, eax, ADDR szBuf
    invoke StdOut, ADDR szModel
    invoke StdOut, ADDR szBuf
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    mov eax, Eax1
    and eax, MASK Family
    shr eax, Family
    invoke dwtoa, eax, ADDR szBuf
    invoke StdOut, ADDR szFamily
    invoke StdOut, ADDR szBuf
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    mov eax, Eax1
    and eax, MASK ProcType
    shr eax, ProcType
    invoke dwtoa, eax, ADDR szBuf
    invoke StdOut, ADDR szProcType
    invoke StdOut, ADDR szBuf
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    mov eax, Eax1
    and eax, MASK ExtMod
    shr eax, ExtMod
    invoke dwtoa, eax, ADDR szBuf
    invoke StdOut, ADDR szExtMod
    invoke StdOut, ADDR szBuf
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    mov eax, Eax1
    and eax, MASK ExtFam
    shr eax, ExtFam
    invoke dwtoa, eax, ADDR szBuf
    invoke StdOut, ADDR szExtFam
    invoke StdOut, ADDR szBuf
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    invoke StdOut, ADDR szFPU
    mov eax, Edx1
    and eax, MASK FPU
    shr eax, FPU
    .IF eax == 1
        invoke StdOut, ADDR szYes
    .ELSE
        invoke StdOut, ADDR szNo
    .ENDIF
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    invoke StdOut, ADDR szMMX
    mov eax, Edx1
    and eax, MASK MMX
    shr eax, MMX
    .IF eax == 1
        invoke StdOut, ADDR szYes
    .ELSE
        invoke StdOut, ADDR szNo
    .ENDIF
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    invoke StdOut, ADDR szSSE
    mov eax, Edx1
    and eax, MASK SSE
    shr eax, SSE
    .IF eax == 1
        invoke StdOut, ADDR szYes
    .ELSE
        invoke StdOut, ADDR szNo
    .ENDIF
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    invoke StdOut, ADDR szSSE2
    mov eax, Edx1
    and eax, MASK SSE2
    shr eax, SSE2
    .IF eax == 1
        invoke StdOut, ADDR szYes
    .ELSE
        invoke StdOut, ADDR szNo
    .ENDIF
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    invoke StdOut, ADDR szSSE3
    mov eax, Ecx1
    and eax, MASK SSE3
    shr eax, SSE3
    .IF eax == 1
        invoke StdOut, ADDR szYes
    .ELSE
        invoke StdOut, ADDR szNo
    .ENDIF
    invoke StdOut, ADDR szCrLf
    ;------------------------------
    jmp done
                     
no_cpuid:

    invoke StdOut, ADDR szNoCPUID
    invoke StdOut, ADDR szCrLf
   
done:

    ;invoke StdOut, ADDR szCrLf
    ;invoke StdOut, ADDR szPak
    ;invoke WaitKey
    invoke ExitProcess, 0
   
end start