用C语言内嵌 汇编 实现取 CPU的基本信息
有人问干嘛要用内嵌呢?直接用纯汇编不好吗?我想说,取到CPU的信息不可以直接用!必须要进行加工处理,汇编写起来很麻烦。核心指令:CPUID
用EAX传入参数,表示要取那些信息。
代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
//取CPU品牌
char cpup;
_asm{
xor eax,eax
CPUID //取信息
mov dword ptr cpup,EBX
mov dword ptr cpup,EDX
mov dword ptr cpup,ECX
}
cpup='\0';
printf("%s\n",cpup);
//获取型号 几86
int CpuTy=0;
int _EDX=0;
_asm{
mov eax,1
CPUID
and eax,00000000000000000000001110000000b //提取出8-11位
mov CpuTy,eax
mov _EDX,edx;
}
CpuTy=CpuTy>>7; //收拾残局 后面还有很多‘0’;
switch(CpuTy)
{
case 2:printf("Dual Processors\n");break;
case 3:printf("386");break;
case 4:printf("i486\n");break;
case 5:printf("Pentium\n");break;
case 6:printf("Pentium Pro Pentium II\n");break;
default:printf("NOT!!!!!\n");
}
if(!((bool)abs(_EDX>>31)))
{
printf("NOT FPU\n");
}else
{
printf("FPU\n");
}
//判断是否支持 MMX指令!
_asm
{
mov eax,_EDX
and eax,00000000010000000000000000000000b //提取出地23位
mov _EDX,eax
}
if((bool)(_EDX>>22))
{
printf("IA MMX\n");
}else
{
printf("NOT IA MMX\n");
}
//电源管理检查
_asm
{
mov eax, 80000007h
cpuid
and EDX,00000000000000000000000010000000b
mov _EDX,EDX
}
if((bool)(_EDX>>7))
{
printf("支持电源管理的CPU!");
}else
{
printf("不支持电源管理的CPU!");
}
}
这里只是抛砖引玉,CPUID的功能非常强大,这里只是列出了一些简单的功能,像缓存,虚拟地址大小,处理器序列号之类的都没写出来。
回帖即可获取详细资料
**** Hidden Message *****
学习一下!!! 很神奇的样子,谢谢老师们的分享真心感谢老师们给予学习机会,谢谢 我只是路过酱油的{:5_103:} 这个不错内嵌汇编也是有大用的 来学习学习来学习学习 谢谢楼主谢谢 有这么麻烦么?
#cpuid.s Sample program to extract the processor Vendor ID
.section .data
output:
.asciz "The processor vendor ID is '%s'\n"
.section .bss
.lcomm buffer,12
.section .text
.globl _start
_start:
movl $0,%eax #设置cpuid 0 命令
cpuid
movl $buffer,%edi
movl %ebx,(%edi)
movl %edx,4(%edi)
movl %ecx,8(%edi)
pushl $buffer
pushl $output
call printf
addl $8,%esp
push $0
call exit 多谢楼主分享 很好,很强大 虽然不太懂但也回复看看 学习一下!!! 谢谢楼主大大的分享,小白在此感谢了。 哇 很好很强大 ! 图书信息管理系统 看看看看
怎样才能在C++中嵌入汇编语言,获得每个电脑唯一的机器呢?这个问题纠结很长时间了。 新手顶一下
学习一下
mark,看了
页:
[1]
2