我在阅读这个问题时想知道是否接受的答案也可以确定体系结构。例如,在汇编语言中,我可以将WORD推入堆栈,然后检查SP。比较新的SP和旧的SP:
差值为4表示32位
差值为8表示64位
我的想法正确吗?
差值为4表示32位
差值为8表示64位
我的想法正确吗?
如果要检测机器码运行模式,请参考这个代码高尔夫 x86 机器码函数,它返回16、32或64:Determine your language's version。相同的机器码字节在不同的解码模式下会产生不同的结果。
或者只需要检测32位与64位,可以参考x86-32 / x86-64 polyglot machine-code fragment that detects 64bit mode at run-time?
在大多数情况下,您不需要检测当前模式,因为您知道您的代码是编译/汇编的。例如({{link3:在NASM中,%ifidn __BITS__ 32
}),或者检查%ifidn __OUTPUT_FORMAT__, elf32
,这也适用于YASM。
使用CPUID可以检测CPU的能力,而不受当前模式的影响。如何在运行时使用GCC和内联汇编检测CPU架构类型?(或者使用cpuid.h
: 如何在Linux中调用“cpuid”?)
这仍然不能告诉您正在运行的操作系统是否支持64位可执行文件;如果您想知道,您应该检查您是否在64位操作系统下运行。CPUID无法帮助您解决这个问题:32位程序查询操作系统的机制当然是特定于操作系统的。
在几乎所有情况下,“您的CPU架构”都不是正确的问题,除非您正在编写自己的内核或编写CPU信息程序。知道它并不能帮助您的程序决定要做什么。
32位x86 CPU已经很多年没有生产了,越来越稀少。但是32位操作系统仍在64位CPU上使用。