! getprocessor() - determine processor type Author: Kees J. Bot ! 26 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text ! int getprocessor(void); ! Return 386, 486, 586, ... .define _getprocessor _getprocessor: push ebp mov ebp, esp and esp, 0xFFFFFFFC ! Align stack to avoid AC fault mov ecx, 0x00040000 ! Try to flip the AC bit introduced on the 486 call flip mov eax, 386 ! 386 if it didn't react to "flipping" jz gotprocessor mov ecx, 0x00200000 ! Try to flip the ID bit introduced on the 586 call flip mov eax, 486 ! 486 if it didn't react jz gotprocessor pushf pusha ! Save the world mov eax, 1 .data1 0x0F, 0xA2 ! CPUID instruction tells the processor type andb ah, 0x0F ! Extract the family (5, 6, ...) movzxb eax, ah cmp eax, 15 ! 15: extended family jne direct mov eax, 6 ! Make it 686 direct: imul eax, 100 ! 500, 600, ... add eax, 86 ! 586, 686, ... mov 7*4(esp), eax ! Pass eax through popa popf gotprocessor: leave ret flip: pushf ! Push eflags pop eax ! eax = eflags mov edx, eax ! Save original eflags xor eax, ecx ! Flip the bit to test push eax ! Push modified eflags value popf ! Load modified eflags register pushf pop eax ! Get it again push edx popf ! Restore original eflags register xor eax, edx ! See if the bit changed test eax, ecx ret