如何使用 __cpuid 检查 AES-NI 支持?

Posted

技术标签:

【中文标题】如何使用 __cpuid 检查 AES-NI 支持?【英文标题】:How to check AES-NI support with __cpuid? 【发布时间】:2018-05-30 16:36:37 【问题描述】:

我正在寻找一种方法来检查我的 CPU 是否支持 AES-NI 指令。我在 Internet 上发现了很多东西,但其中很多都是内联汇编代码,而且由于我在 Microsoft Visual Studio 下并且我在 x64 中编译,所以这不起作用。 Visual Studio 不支持 x64 内联汇编代码,而 x64 对我来说至关重要。

于是我找到了内在函数__cpuid()。问题是我不知道汇编/内在用途等……(我只是复制粘贴我找到的代码)

所以我在这里问你关于我使用互联网代码片段自己编写的以下代码。输出是“AES-Ni supported”,但这并不意味着我的代码是正确的,并且真正检索了我的 CPU 的 AES-NI 容量。

int cpuInfo[4] =  -1 ;

__cpuid(cpuInfo, 1);
_Bool returned = ((cpuInfo[3] & 0x2000000) != 0);

if (returned == 1)
    printf("AES-NI supported");
else
    printf("AES-NI not-supported");

【问题讨论】:

请注意,“官方”微软解决方案是here 是的,谢谢,但由于它是 C++,我并没有真正阅读整篇论文。无论如何,谢谢你 【参考方案1】:

AES 位在 ECX(第 25 位)中,因此您应该使用 cpuInfo[2]。

【讨论】:

以上是关于如何使用 __cpuid 检查 AES-NI 支持?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复模拟器:qemu-system-x86_64:警告:主机不支持请求的功能:CPUID.80000001H:ECX.abm [位 5]

如何调用 CPUID 叶 7 和子叶 0?

__get_cpuid 的可移植性如何?

Patch OpenSSL使其支持CHACH20_POLY1305加密算法

在 <intrin.h> 中使用 __cpuid() 时出现链接错误?

在 Windows 上使用 JNA 调用 __cpuid 函数