当前位置: 首页 > news >正文

Linux C/C++ 获取CPUID

实现方式:

INTEL CC 格式

AT^T CC   格式

GCC/C库 __cpuid 宏

大致讲义:

AT^T 格式汇编很反人类,GCC可以改编译器选项为INTEL内嵌汇编,但一般在GCC还是按照默认的AT^T汇编来拽写把,不想用也可以让AI工具把INTEL内嵌汇编转换为AT^T汇编(让 bard、gpt、bing 干这种反人类的活很好用),AT^T汇编格式没有学的必要,这是一个反人类的东西。

            __asm__ __volatile__(
                "movl $0x00, %%eax\n\t"
                "xorl %%edx, %%edx\n\t"
                "cpuid\n\t"
                "movl %%eax, %0\n\t"
                "movl %%edx, %1\n\t"
                : "=m" (s1), "=m" (s2)
                :
                : "%eax", "%edx"
            );

汇编是一种面向地址标识符及通用寄存器编程的低级语言。

IL: 把立即数0移动到EAX寄存器,CPU参数(LEVEL,CPU内置指令函数取值范围0~1)

IL: 把EDX寄存器XOR(亦或)重置为0

IL: cpuid 指令(会推送值到EAX、EBX、ECX、EDX 四个寄存器之中,SN[4])

IL: 把EAX寄存器的值复制给内链参数一(注意是压入是内存地址,%0 = s1变量)

IL: 把EDX寄存器的值复制给内链参数二(注意是压入是内存地址,%1 = s2变量)

声明内嵌所需要的寄存器与变量内存地址。

注解:

__asm__ __volatile__ ("movl $0x00, %%eax\n\t"   // 将立即数 0x00 移动到 eax 寄存器中"xorl %%edx, %%edx\n\t"  // 将 edx 寄存器与自身进行异或操作,相当于将 edx 清零"cpuid\n\t"              // 执行 cpuid 指令,用于获取 CPU 的信息"movl %%eax, %0\n\t"     // 将 eax 寄存器的值移动到 s1 变量中"movl %%edx, %1\n\t"     // 将 edx 寄存器的值移动到 s2 变量中: "=m" (s1), "=m" (s2)   // 输出操作数列表,将 s1 和 s2 分别与 %0 和 %1 关联起来:                        // 输入操作数列表为空: "%eax", "%edx"         // 使用了 eax 和 edx 寄存器,需要在此处进行声明
);

具体实现:

#if defined(__x86_64__) || defined(_M_X64) || defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86)ppp::string CPUID() noexcept { int s1, s2, s3, s4;// int sn[4]; /* #include <cpuid.h> */// __cpuid(0, sn[0], sn[1], sn[2], sn[3]);// s1 = sn[0];// s2 = sn[3];// __cpuid(1, sn[0], sn[1], sn[2], sn[3]);// s3 = sn[0];// s4 = sn[3];// INTEL CC:// __asm // {//     mov eax, 00h//     xor edx, edx//     cpuid//     mov dword ptr[s1], eax//     mov dword ptr[s2], edx// }// __asm // {//     mov eax, 01h//     xor ecx, ecx//     xor edx, edx//     cpuid//     mov dword ptr[s3], eax//     mov dword ptr[s4], edx// }// AT&T CC__asm__ __volatile__("movl $0x00, %%eax\n\t""xorl %%edx, %%edx\n\t""cpuid\n\t""movl %%eax, %0\n\t""movl %%edx, %1\n\t": "=m" (s1), "=m" (s2):: "%eax", "%edx");__asm__ __volatile__("movl $0x01, %%eax\n\t""xorl %%ecx, %%ecx\n\t""xorl %%edx, %%edx\n\t""cpuid\n\t""movl %%eax, %0\n\t""movl %%edx, %1\n\t": "=m" (s3), "=m" (s4):: "%eax", "%ecx", "%edx");// You can query all CPU processor instances using WQL in wbemtest, // View the ProcessorId attribute of the processor instance MOF, // And clarify the rules for the operating system CPUID to obtain and format as text.char buf[40];snprintf(buf, sizeof(buf), "%016llX %016llX",(long long unsigned int)((int64_t)s4 << 32 | (int64_t)s3),(long long unsigned int)((int64_t)s2 << 32 | (int64_t)s1));return buf;}
#endif

http://www.lryc.cn/news/272767.html

相关文章:

  • 2023年“中银杯”安徽省网络安全B模块(部分解析)
  • 194.【2023年华为OD机试真题(C卷)】单行道汽车通行时间(迭代计算—JavaPythonC++JS实现)
  • 第二证券机构策略:股指预计维持蓄势震荡格局 关注煤炭、电力等板块
  • Go 泛型之泛型约束
  • 【数据仓库与联机分析处理】数据仓库
  • 机器学习:贝叶斯估计在新闻分类任务中的应用
  • [C#]基于deskew算法实现图像文本倾斜校正
  • Qt通过pos()获取坐标信息
  • 【Webpack】资源输入输出 - 配置资源出口
  • 【XR806开发板试用】XR806串口驱动CM32M对小厨宝的控制实验
  • 中介者模式-Mediator Pattern-1
  • ASP.NET Core基础之图片文件(一)-WebApi图片文件上传到文件夹
  • 精准掌控 Git 忽略规则:定制化 .gitignore 指南
  • Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果
  • k8s 之7大CNI 网络插件
  • stable diffusion 人物高级提示词(一)头部篇
  • 限制哪些IP能连接postgre
  • 可狱可囚的爬虫系列课程 08:新闻数据爬取实战
  • mysql2pgsql
  • 设计模式-流接口模式
  • Java 堆与栈的作用与区别
  • 再谈小米汽车
  • Power Apps 学习笔记 - IOrganizationService Interface
  • 常见函数的4种类型(js的问题)
  • DNS主从服务器、转发(缓存)服务器
  • 第二十一章 网络编程
  • scratch新跳7游戏 2023年12月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析
  • 三、C#面向对象编程(接口与实现)
  • 【java爬虫】股票数据获取工具前后端代码
  • Scikit-Learn线性回归(四)