c++ - 在运行时以编程方式检测 CPU 架构
问题描述
是否可以通过低级代码(C/C++ 或汇编)在不从操作系统或某些 API 收集信息的情况下检查 x86/x86-64 CPU 中的 CPU 架构(64 位或 32 位)?
可以检查指针的大小,就像在此处讨论的那样,但是,据我了解,这种方式可以让您知道操作系统架构是为编译的,因为运行 32 位操作系统的 64 位 CPU 会报告错误的结果。
也许一些cpuid
指令或类似的东西可以解决问题,但我找不到任何完全满足这些要求的东西。如果您认为这是不可能的,我希望有充分的理由来证明这一点(这可能是一个不太客观的答案)。如果您想知道,这是一个 CPU 检测软件。
编辑:在确定 32/64 bit architecture in assembly 中,OP 没有得到一些具体的答案来解释如何做到这一点,只是你应该使用 cpuid,并链接到How do you detect the CPU architecture type during run-time with GCC和内联汇编?,这对我来说是一个很好的答案,但它不如我标记为已接受的答案那么完整,因为 Remy Lebeau 给出了详细的解释并告诉了必须查询哪个特定的 cpuid 位,而不仅仅是编写一些代码,并且我发现它更适合我的问题,因为它在更高级别的范围内进行了解释(我从未提到 gcc,第二篇文章提到了)
解决方案
可以为在 32 位或 64 位模式下运行的 x86 编写代码。如果您正在运行此类代码,则可以使用以下命令检查您所处的模式:
get_mode:
mov eax, 1
dec eax
test eax, eax
ret
在 64 位模式下,dec eax
成为测试指令的 REX.W 前缀。因此,此代码在 32 位模式下运行时返回 0,而在 64 位模式下运行时返回 1。它还相应地设置 Z,因此可以从另一个汇编语言函数中使用它,如下所示:
call get_mode
jnz mode64
推荐阅读
- c# - FCTRL - SPOJ 的阶乘
- php - Symfony 3.4 - Api Rest 修改值
- database - 时间与时间序列数据库
- excel - 将纯文本粘贴到excel中,缺少空白列?
- node.js - 增加 Ghost Docker 的 PID
- postgresql - 使用我的 ASP.NET CORE API 插入 postgres 数据库时出错
- php - 如何在一定延迟后从另一个 php api 文件运行 php api 文件,而不使用 sleep()?
- python - “numpy.float64”对象不支持项目分配
- python - 按模式从列表中获取某些文件
- sql - 如何使用查询连接天蓝色数据表?