是否可以通过低级代码(C / C ++或程序集)检查x86 / x86-64 CPU中的CPU体系结构(64位还是32位),而无需从OS或某些API收集信息?
可以像上面讨论的here那样检查指针的大小,但是据我所知,这种方式可以让您知道OS体系结构是针对其编译的,因为运行32位OS的64位CPU会报告错误的结果。
也许有些cpuid
指令或类似的指令可以解决问题,但是我找不到完全满足这些要求的东西。如果您认为这是不可能的,那么我很乐意为您辩解(这可能是一个不太客观的答案)。如果您想知道,这是用于CPU检测软件的。
编辑: 在Determine 32/64 bit architecture in assembly中,OP并没有得到解释该操作方法的特定答案,只是您应该使用cpuid,并链接到How do you detect the CPU architecture type during run-time with GCC and inline asm?,这对我来说是一个很好的答案,但事实并非如此。就像我标记为接受的答案一样完整,因为Remy Lebeau给出了详细的解释并告诉您必须查询哪个特定的cpuid位,而不仅仅是编写一些代码,而且我发现它更适合我的问题,因为在更高层次的范围(我从没提到过gcc,第二篇文章确实如此)
答案 0 :(得分:5)
可以为以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
答案 1 :(得分:3)
如果将可执行文件编译为64位,则CPU必须仅是64位。
如果将可执行文件编译为32位,则CPU 可以为32位或64位(如果64位CPU能够运行32位代码),因此必须查询CPU来区分。最好在可能的情况下从操作系统获取该信息,但是CPU 可能有自己的查询信息。
例如,在x86或x86-64 CPU上,有CPUID
条指令可用:
On Intel CPUs,CPUID
的{{3}}查询包括一个ia64
功能标志(IA64处理器模拟x86)。
"Processor Info and Feature Bits",CPUID
的{{3}}查询包括一个On AMD CPUs功能标志。
CPUID
有一个"Extended Processor Info and Feature Bits"查询,以确定CPU制造商。