【问题标题】:Determine 32/64 bit architecture in assembly确定汇编中的 32/64 位架构
【发布时间】:2011-02-03 20:53:35
【问题描述】:

我正在阅读this question 并想知道接受的答案是否也可能是确定架构的一种方式。例如,在 asm 中,我可以将一个 WORD 压入堆栈,然后检查 SP。比较新 SP 和旧 SP:

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

我的想法正确吗?

【问题讨论】:

  • 我的印象是 32 位和 64 位汇编指令是不同的。至少在 x86 与 x86-64 中。
  • 我不知道,但如果你只是想检测64位支持你可以使用CPUID指令。
  • 通常在编译时就知道目标是 64 位还是 32 位。这种技巧有用的情况确实很少见。另外,我的猜测是有一种方法可以直接检查相关标志,而不必做类似这样的技巧。
  • @OMG:对于 push 和 pop,操作码的解码方式相同。例如 0xFF 在 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?

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


【解决方案1】:

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

就像提到的 cmets 中的某个人一样,CPUID 是判断您的架构是什么的唯一可靠方法。

【讨论】:

    【解决方案2】:

    有关检测其运行模式的机器代码,请参阅返回 16、32 或 64 的 code-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.hHow do I call "cpuid" in Linux?

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

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

    仅 32 位的 x86 CPU 已经多年没有制造出来了,而且越来越少见。但 32 位操作系统仍在 64 位 CPU 上使用。

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 2010-11-08
      • 2014-01-05
      • 1970-01-01
      • 2019-04-15
      • 2017-03-20
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多