在MAM/MASM64中编译时检测架构

8
我该如何在ASM源文件中在编译时检测目标架构是否为I386或AMD64?
我正在使用masm(ml.exe)/masm64(ml64.exe)来汇编file32.asm和file64.asm。很希望能够创建一个单独的文件file.asm,它应该包含file32.asm或file64.asm,具体取决于架构。理想情况下,我希望能够编写类似以下代码:
IFDEF amd64 include file64.asm ELSE include file32.asm ENDIF
同时,如果需要,我可以使用不同的命令行选项运行ml.exe和ml64.exe。
谢谢!

小细节:你是组装 ASM 文件,而不是编译它们 :) - jww
3个回答

13
IFDEF RAX

  ECHO "WIN64"

ELSE

  ECHO "WIN32"

ENDIF

2
奇怪的是,IFNDEF RAX 似乎不起作用... 无论在 ML 还是 ML64 中,rax 都被 IFNDEF 视为未定义。因此,显然必须使用 IFDEF RAX/64位 only/ELSE/32位 only/ENDIF(即仅使用 IFDEF,而不是它的反义词)。 - Paul Houle

7
如果我理解正确的话,您正在寻找某种内置定义,在32位和64位MASM版本中具有不同的值。我曾经也寻找过类似的东西,但没有找到合适的内容。
然而,您可以很容易地定义自己的内容,例如在源文件开头定义AMD64 equ 1以选择所需的代码路径,或者在ML / ML64命令行中定义,例如/DAMD64。然后使用IFDEF / IFNDEF,就像您建议的那样。

谢谢!我在命令行中没有看到 /Dmacro 选项,尽管我查看了命令行选项,即使它与 C 编译器使用的选项相同 :)) - botismarius
“你正在寻找某种内置定义…” - MASM 定义了什么?对于 CL,它为 x86 定义了“_M_IX86”,为 x64 定义了“_M_X64”。 - jww

1

x86 和 x64 指令集(甚至没有提及堆栈使用和限制)非常不同,以至于我想知道这是否有意义……也就是说,编写高效的与体系结构无关的 x86 / x64 代码对我来说几乎不可能。 这是汇编语言,而不是某个可移植 HLL。

这很可能也是为什么有两个特定的汇编器 ml.exe 和 ml64.exe,而不是一个带有额外指令帮助处理所有内容的单个 ml.exe 的原因。


由于某些原因,我确实需要为32位和64位目标同时公开一个单独的ASM文件。该文件将仅包括file32.asm或file64.asm,没有其他内容。 - botismarius
“我在想那是否有意义……” - 对我来说,一个带有类C预处理器宏保护的X86和X64实现的单一源代码非常有意义……这就是我为什么在这里的原因。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接