我正在阅读this question,并想知道接受的答案是否也是确定架构的方法。例如,在asm中我可以将WORD推入堆栈然后检查SP。将新SP与旧SP进行比较:
4的差异意味着32位
Diff为8表示64位
我在这个想法中是否正确?
答案 0 :(得分:6)
不,因为堆栈的大小取决于您运行的模式(真实,受保护,长/ 64,vm86,smm等),而不是基于体系结构。例如,如果程序集在保护模式下运行,则堆栈将为32位(如果操作数为16位,则为16位),即使处理器为x86-64也是如此。
与上述评论中的某些人一样,CPUID是了解您的架构的唯一可靠方式。
答案 1 :(得分:0)
有关检测其运行方式的机器代码,请参见此代码高尔夫球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?
在大多数情况下,您无需检测当前模式,因为您知道代码是针对什么进行编译/汇编的。 (例如,in NASM, %ifidn __BITS__ 32
,或选中%ifidn __OUTPUT_FORMAT__, elf32
也可以在YASM中使用。)
要在任何当前模式下都检测CPU功能,请使用CPUID。 How do you detect the CPU architecture type during run-time with GCC and inline asm?(或使用cpuid.h
:How do I call "cpuid" in Linux?)
这仍然无法告诉您您所运行的操作系统是否支持64位可执行文件;如果您想知道应该只检查自己是否在64位操作系统下运行。 CPUID不能帮助您:32位程序查询操作系统的机制当然是特定于操作系统的。
在几乎所有情况下,IMO的CPU“体系结构”都不是正确的问题。 (即除非您正在编写自己的内核或编写CPU信息程序)。知道它并不能帮助您的程序决定要做什么。
仅32位的x86 CPU已经制造多年了,并且变得越来越稀有。但是,具有64位功能的CPU仍在使用32位OS。