我使用这段代码的目的是检查我的处理器是否支持rdrand,如果不支持,则执行其他一些随机数生成函数。要检查是否支持rdrand,应该设置ecx寄存器中的第30位。
我想我的难题之一是是否应该显式地检查级别1,但我认为eax隐式地设置了这个级别。此外,我想知道是否应该将寄存器的值设置为0。我也想知道有什么“难题”和可能的改进。
#include <stdio.h>
#include <string.h>
#define bit_RDRND (1 << 30)
int main(int argc, char **argv)
{
unsigned int eax;
unsigned int ebx;
unsigned int ecx;
unsigned int edx;
eax = 0x01;
__asm__ __volatile__(
"cpuid;"
: "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
: "a"(eax)
);
printf("The value of the ecx register is %08x.\n", ecx);
if(ecx & bit_RDRND){
//use rdrand
printf("use rdrand\n");
}
else{
//use mt19937
printf("use mt19937");
}
return 0;
}发布于 2016-11-21 06:53:11
这是:
printf("The value of the ecx register is %08x.\n", ecx);都没问题。然而,对于其他两个:
printf("use rdrand\n");以及:
printf("use mt19937");更简单通常比更复杂更好,所以我建议你用puts而不是。:
puts("use rdrand");以及:
puts("use mt19937");此外,puts会自动添加换行符,这样您就不用担心它了。(而且,我假设您想要一个继\n之后的"use mt19937",因为您在"use rdrand\n"中有一个。)
https://codereview.stackexchange.com/questions/147656
复制相似问题