QT内嵌汇编cpuid

目录

1 获取cpuid

2 cpuid

3 注释


经测试以前采用汇编的方法,执行完cpuid后ebx寄存器返回的值不唯一

使用下面的方法获取cpu_id

    QString cpu_id;
    QProcess p;
    p.start("wmic cpu get ProcessorID");
    p.waitForFinished();
    cpu_id = QString::fromLocal8Bit(p.readAllStandardOutput());
    cpu_id = cpu_id.remove("ProcessorId").trimmed();
    qDebug()<<"cpu_id:"<<cpu_id;

----------------------------------------------------

1 获取cpuid

__asm__ __volatile__ (
        "movl   %%eax, %%edi\n"
        "xorl   %%ebx, %%ebx\n"
        "xorl   %%ecx, %%ecx\n"
        "xorl   %%edx, %%edx\n"
        "cpuid\n"
        "movl   %%edx, (%%esi)\n"
        "movl   %%ecx, 4(%%esi)\n"
        "movl   %%ebx, 8(%%esi)\n"
        "movl   %%eax, 12(%%esi)\n"
        : "=d"(s[0]), "=b"(s[1]),"=c"(s[2]),"=a"(s[3])
        : "a"(0x1), "c" (0),"d"(0), "S"(s)

    );

2 cpuid

执行cpuid指令后,返回值寄存器(eax、ebx、ecx、edx)的值会被更新,这些值可以被存储到内存中或进一步处理。具体来说,执行cpuid指令后,寄存器的值将被更新为以下值:

  • ebx寄存器:包含CPUID的第二个返回值。
  • ecx寄存器:包含CPUID的第三个返回值。
  • edx寄存器:包含CPUID的第四个返回值。
  • eax寄存器:包含CPUID的第一个返回值,通常包含处理器型号和厂商信息。

这些寄存器的值可以被存储到内存中或进一步处理,例如通过循环来遍历所有可用的CPUID值,或者通过cmp指令来比较不同的CPUID值。

3 注释

这段汇编代码使用了GCC的内联汇编语法,实现了执行CPUID指令并将结果存储在数组s中的功能。

具体来说,代码执行了以下操作:

  1. 将寄存器%eax的值存储到%edi中,这一步似乎没有实际意义,因为%edi通常被用于函数调用中的参数。
  2. 将寄存器%ebx、%ecx和%edx清零。
  3. 执行CPUID指令,获取CPU的ID信息,并将结果分别存储在寄存器%edx、%ecx、%ebx和%eax中。
  4. 将寄存器%edx的值存储到数组s的第1个元素中,将寄存器%ecx的值存储到数组s的第2个元素中,将寄存器%ebx的值存储到数组s的第3个元素中,将寄存器%eax的值存储到数组s的第4个元素中。
  5. a,b,c,d分别对应eax寄存器ebx寄存器ecx寄存器edx寄存器
  6. "a"(0x1)表示输入 "=a"(s[3])表示输出

上面的代码是QT 5.12 mingw 编译器

QT 5.7 msvc 编译器可直接运行下面的汇编

 __asm{
        mov   eax,01h
        xor   edx,edx
        cpuid
        mov   s[0],edx
        mov   s[1],eax
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值