您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?
Posted
技术标签:
【中文标题】您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?【英文标题】:How do you detect the CPU architecture type during run-time with GCC and inline asm? 【发布时间】:2009-12-16 21:09:47 【问题描述】:我需要找到 CPU 的架构类型。我无权访问 /proc/cpuinfo,因为机器正在运行 syslinux。我知道有一种使用内联 ASM 的方法,但是我认为我的语法不正确,因为我的变量 iedx 没有正确设置。
我和 ASM 一起吃苦头,绝不是专家。如果有人有任何提示或可以为我指出正确的方向,我将非常感激。
static int is64Bit(void)
int iedx = 0;
asm("mov %eax, 0x80000001");
asm("cpuid");
asm("mov %0, %%eax" : : "a" (iedx));
if ((iedx) && (1 << 29))
return 1;
return 0;
【问题讨论】:
如果您运行的是 64 位代码,那么您运行的是 64 位处理器。容易。 匿名:如果您运行的是 32 位代码,那么您可能运行在诸如 x86-64 架构之类的架构上,而不仅仅是 32 位架构。 【参考方案1】:这么几行你能装多少错误 ;)
试试
static int is64bit(void)
int iedx = 0;
asm volatile ("movl $0x80000001, %%eax\n"
"cpuid\n"
: "=d"(iedx)
: /* No Inputs */
: "eax", "ebx", "ecx"
);
if(iedx & (1 << 29))
return 1;
return 0;
【讨论】:
cpuid 也需要 ebx 和 edx clobbers。 @HolyBlackCat 和 \@Peeter:"=d"
是 EDX 输出。您不能破坏无法编译的输出操作数。
您还可以使用约束为其提供 EAX 输入,附带的好处是它将与 -masm=intel
godbolt.org/g/Ltsww1 一起编译。或者更好的是,使用来自cpuid.h
的现有cpuid
包装函数。 How do I call "cpuid" in Linux?以上是关于您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?的主要内容,如果未能解决你的问题,请参考以下文章