⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 get_cpu_64flag.cpp

📁 这是一段汇编代码
💻 CPP
字号:
#define FLAG_IA64	1 // Intel IA64
#define FlAG_EM64T	2 // Intel EM64T
#define FLAG_INTELCPU_NOT64 3 //Intel IA32
#define FLAG_AMD	4 //AMD CPU: unsupported
#define FLAG_Cyrix	5 //Cyrix CPU: unsupported 
#define FLAG_UNKNOWNCPU 6 //unknown vendor CPU: unsupported
#define FLAG_NOCPUID_SUPPORT	7 //cpu not support for cpuid instruction,早期的8086 286 386等,Intel从486开始支持
								  // or not support the input of cpuid (eax = 1; eax = 80000001h) 

#include "stdio.h"
#include "string.h"

int get_cpu_64Flag()
{
	int em64t_mask = 0x20000000;
	int ia64_mask = 0x40000000;

	char vendor_id[13] = {0};
	

	
	__asm{

		;//judge support of CPUID
		pushfd ; save EFLAGS
		pop eax ; store EFLAGS in EAX
		mov ebx, eax ; save in EBX for later testing
		xor eax, 00200000h ; toggle bit 21
		push eax ; push to stack
		popfd ; save changed EAX to EFLAGS
		pushfd ; push EFLAGS to TOS
		pop eax ; store EFLAGS in EAX
		cmp eax, ebx ; see if bit 21 has changed
		jz NO_CPUID ; if no change, no CPUID
		;//get vendor_id
		mov eax, 0
		_EMIT 0fh ;//CPUID
		_EMIT 0a2h 
		mov dword ptr [vendor_id], EBX
		mov dword ptr [vendor_id + 4], EDX
		mov dword ptr [vendor_id + 8], ECX

		;//cmp for "GenuineIntel"
		cmp ebx, 756E6547H ;'Genu'
		jne NOT_INTEL
		cmp edx, 49656E69H ;'ineI'
		jne NOT_INTEL
		cmp ecx, 6C65746EH ;'ntel'
		jne NOT_INTEL

		cmp eax, 1 ;make sure 1 is valid input for CPUID
		jl  NO_CPUID

		;//get ia64_mask
		mov eax, 1
		_EMIT 0fh ;//CPUID
		_EMIT 0a2h 
		and edx, ia64_mask
		cmp edx, ia64_mask
		je  IA64
		
		;//get em64t_mask

		mov eax, 80000000h
		_EMIT 0fh ;//CPUID
		_EMIT 0a2h 

		cmp eax,80000001h; make sure 80000001h is valid input for CPUID
		jl NO_CPUID
		
		mov eax, 80000001h
		_EMIT 0fh ;//CPUID
		_EMIT 0a2h 
		and edx, em64t_mask
		cmp edx, em64t_mask
		je  EM64T
	}

	return FLAG_INTELCPU_NOT64;

NO_CPUID:
	return FLAG_NOCPUID_SUPPORT;
	
NOT_INTEL:	
	if (0 == strcmp(vendor_id,"CyrixInstead"))
		return FLAG_Cyrix;

	else if (0 == strcmp(vendor_id,"AuthenticAMD"))
		return FLAG_AMD;

	else return FLAG_UNKNOWNCPU;
IA64:
	return FLAG_IA64;
EM64T:
	return FlAG_EM64T;
}

int main()
{
	int flag = 0;

	flag = get_cpu_64Flag();

	switch(flag){
		
	case  FlAG_EM64T:
		printf("Intel EM64T \n");
		break;

	case  FLAG_IA64:
		printf("Intel IA64 \n");
		break;
	
	case  FLAG_INTELCPU_NOT64:
		printf("Intel CPU: not IA64 or EM64T, possiable IA32 \n");
		break;

	case  FLAG_Cyrix:
		printf("it is a Cyrix CPU, unsupported \n");
		break;
	
	case  FLAG_AMD:
		printf("it is a AMD CPU, unsupported \n");
		break;

	case  FLAG_UNKNOWNCPU:
		printf("unknown cpu vendor: not Intel or AMD or Cyrix. unsupported \n");
		break;
	
	case  FLAG_NOCPUID_SUPPORT:
		printf("no cpuid support, can't get the cpu info \n");
		break;


	default:
		printf("return error %d \n",flag);
	}
	getchar();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -