代码之家  ›  专栏  ›  技术社区  ›  IAbstract

确定程序集中的32/64位体系结构

  •  6
  • IAbstract  · 技术社区  · 16 年前

    我在复习 this question 他想知道,被接受的答案是否也是确定体系结构的一种方法。例如,在asm中,我可以将一个单词推到堆栈上,然后检查sp。将新sp与旧sp进行比较:

    4之差表示32位
    差8表示64位

    我的想法对吗?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Jeff B    16 年前

    不,因为堆栈的大小取决于运行的模式(real、protected、long/64、vm86、smm等),而不是体系结构。例如,如果程序集以保护模式运行,则堆栈将为32位(如果操作数为16位,则为16位),即使处理器为x86-64。

    像上面提到的评论中的某些人一样,cpuid是唯一可靠的方法来告诉您的体系结构是什么。

        2
  •  0
  •   Peter Cordes    7 年前

    有关检测其运行模式的机器代码,请参阅此代码返回16、32或64的Golf x86机器代码函数: 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位程序查询操作系统的机制当然是特定于操作系统的。

    在几乎所有的情况下,我认为CPU的“架构”并不是一个正确的问题。(即,除非您正在编写自己的内核,或编写cpu信息程序)。知道这并不能帮助你的程序决定该做什么。

    32位x86处理器已经多年没有生产了,而且越来越少。但32位操作系统仍在64位CPU上使用。