无名侠 发表于 2014-1-22 16:34:02

用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 *****

消尽不死鸟 发表于 2014-1-22 16:53:33

学习一下!!!

Jany 发表于 2014-1-22 16:55:54

很神奇的样子,谢谢老师们的分享真心感谢老师们给予学习机会,谢谢

du_fish 发表于 2014-1-24 23:46:20

我只是路过酱油的{:5_103:}

夏季 发表于 2014-1-25 00:13:47

这个不错内嵌汇编也是有大用的

鹏程完了 发表于 2014-1-25 00:20:07

来学习学习来学习学习

a175676 发表于 2014-1-29 04:25:10

谢谢楼主谢谢

oggplay 发表于 2014-2-8 20:44:04

有这么麻烦么?
#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

agong 发表于 2014-2-18 09:16:40

多谢楼主分享

李小涵 发表于 2014-2-18 10:23:33

很好,很强大

jiangyuming0434 发表于 2014-2-18 10:56:11

虽然不太懂但也回复看看

パイナップル 发表于 2014-3-2 16:16:19

学习一下!!!

放鸟的笼子 发表于 2014-9-6 17:25:34

谢谢楼主大大的分享,小白在此感谢了。

907806863 发表于 2014-9-28 08:59:52

哇 很好很强大 !

caozb 发表于 2014-10-6 16:15:22

图书信息管理系统

JinLei 发表于 2014-10-18 21:48:16

看看看看

55幸运 发表于 2015-1-25 16:50:10

怎样才能在C++中嵌入汇编语言,获得每个电脑唯一的机器呢?这个问题纠结很长时间了。

丛无到有 发表于 2015-1-25 19:31:46

新手顶一下

zjc7836 发表于 2015-1-25 19:38:03

学习一下

text6789 发表于 2015-3-7 14:37:42

mark,看了
页: [1] 2
查看完整版本: 用C语言内嵌 汇编 实现取 CPU的基本信息