我正在开发一个使用 Microsoft 工具链(cl.exe、ml.exe、link.exe)的项目,我试图将其移植到 LLVM/clang,作为开源工作的一部分。移植 C 文件的编译非常简单,但弄清楚如何构建我们的许多 *.asm 文件(用 MASM 语法编写)却让我陷入了困境。
我无法找到 llvm 工具(或 nasm)从 MASM 源生成目标文件的方法。移植文件本身将是很多计划外的工作,我需要尽可能避免这些工作,特别是因为其中许多文件不属于我们。
有什么建议吗?有什么晦涩的命令行开关可以解决这个问题吗?我听说过 JWasm,但还没有研究过。如果从 masm 移植到 nasm 是唯一的选择,是否有任何指南可以简化转换?
最佳答案
没有任何命令行选项可以使 NASM、GAS 或 LLVM 理解 MASM 语法和指令。
GAS .intel_syntax noprefix
与 MASM 类似,因此您只需移植指令(例如 proc foo
/end foo
foo:
。以及 .long 1234
而不是 dd 1234
)和宏。我至少会比较机器代码与 MASM 构建的目标文件,看看它是否以相同的方式组装。 (也许是模绝对地址)。或者至少进行 diff 反汇编,看看两个版本是否反汇编回相同的指令。
我还没有尝试过 JWasm,但这可能是你最好的选择。我认为它应该真正汇编 MASM 语法。从长远来看,您可能希望通过移植到 GAS .intel_syntax
来减少构建依赖,否则就继续使用 JWasm,除非它在可移植性或其他方面有缺点。
汇编语言不仅仅是带有指令的行。数据的对齐和布局可能很重要,任何与节/段有关的技巧以及使它们可执行或不可执行的技巧都可能很重要。
关于assembly - 如何使用 llvm/clang 构建(或移植?)MASM ASM 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58327530/