在汇编中确定32/64位架构

时间:2010-04-02 20:30:27

标签: assembly x86 32bit-64bit x86-64

我正在阅读this question,并想知道接受的答案是否也是确定架构的方法。例如,在asm中我可以将WORD推入堆栈然后检查SP。将新SP与旧SP进行比较:

4的差异意味着32位
Diff为8表示64位

我在这个想法中是否正确?

2 个答案:

答案 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.hHow do I call "cpuid" in Linux?

这仍然无法告诉您您所运行的操作系统是否支持64位可执行文件;如果您想知道应该只检查自己是否在64位操作系统下运行。 CPUID不能帮助您:32位程序查询操作系统的机制当然是特定于操作系统的。

在几乎所有情况下,IMO的CPU“体系结构”都不是正确的问题。 (即除非您正在编写自己的内核或编写CPU信息程序)。知道它并不能帮助您的程序决定要做什么。

仅32位的x86 CPU已经制造多年了,并且变得越来越稀有。但是,具有64位功能的CPU仍在使用32位OS。

相关问题