assembly - 如何使用 llvm/clang 构建(或移植?)MASM ASM 文件?

标签 assembly llvm nasm masm

我正在开发一个使用 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/

相关文章:

assembly - 在 Linux 内核中断处理程序中传递函数参数(从 asm 到 C)

c - 从 Cortex M0+ 上的硬故障中恢复

assembly - 在汇编中除以 10 未给出正确结果

c++ - 缺少用于 LLVM 编译器-rt 的 libclang_rt.san-x86_64.a 文件

linux - bin执行错误

assembly - 删除程序集中的文件

assembly - 是否有编程语言 "below"汇编?

c++ - 我如何打印到 LLVM 中的字符串

c++ - LLVM 查找每条分配内存的指令

windows - 如何在汇编程序中更改屏幕背景