Я хочу иметь возможность проверить, есть ли у процессора AES-NI, доступный для него, с кодом C ++ в Windows. (MinGW GCC)
Я нашел решение, написанное на C # с Visual Studio.
Тест на инструкции AES-NI от C #
private static bool IsAESNIPresent()
{
byte[] sn = new byte[16]; // !!! Here were 8 bytes
if (!ExecuteCode(ref sn))
return false;
var ecx = BitConverter.ToUInt32(sn, 8);
return (ecx & (1 << 25)) != 0;
}
Есть ли простой способ сделать то же самое с C ++? (ССЗ)
Есть некоторый код в PyCrypto это, кажется, применимо. Я взял основные части кода для тестирования:
#include <cpuid.h>
#include <stdint.h>
#include <stdio.h>
int main()
{
uint32_t eax, ebx, ecx, edx;
eax = ebx = ecx = edx = 0;
__get_cpuid(1, &eax, &ebx, &ecx, &edx);
printf("%08x %08x %08x %08x\n", eax, ebx, ecx, edx);
printf("Has AES-NI: %d\n", (ecx & bit_AES) > 0);
return 0;
}
Похоже, что результаты соответствуют информации, предоставленной / proc / cpuinfo, или информации, предоставленной веб-страницами Intel.
Для других возможностей, см. ленточная документация
Для смеха вы можете сделать это …
int have_aes_ni = (((int(*)())"1\xc0\xb0\1\xf\xa2\x89\xc8\xc3")()>>25)&1;
…но тебе придется пройти /SECTION:.data,RWE
компоновщику, и вы будете осуждены вашими профессиональными коллегами. Вы можете похвастаться тем, как ваш код работает в Linux, так как Security выводит вас из объекта.
На Windows начиная с Visual C ++ 2005 вы можете сделать что-то вроде
#include<intrin.h>
...
int regs[4];
__cpuid( regs, 1 );
int have_aes_ni = ( regs[2] >> 25 ) & 1;
РЕДАКТИРОВАТЬ: я не понял, что вы использовали Mingw, где intrin.h
может быть недоступен В таком случае, J J. Hakalaответ, вероятно, лучше.