【问题标题】:How to produce MASM format assembly from C code如何从 C 代码生成 MASM 格式的程序集
【发布时间】:2020-05-30 16:00:16
【问题描述】:

我正在编写一个 C 程序,我想编译为汇编,进行修改,然后使用 MSVS 中包含的 MASM 汇编器将其编译为可执行文件。

我知道 MSVS 本身允许 C 程序的汇编输出,但我发现这些输出似乎添加或省略了代码,以至于 MASM 无法在不进行重大修改的情况下对其进行汇编。

有没有一种方法可以从一些 C 代码中生成 MASM 语法格式的程序集,我可以用 MASM 进行汇编,只需极少修改甚至无需修改?

【问题讨论】:

  • 我认为-masm=intel 与 gcc 非常接近,但仍需要进行一些编辑。
  • MSVC 的 asm 输出采用 MASM 语法/格式。如果您想从中复制一个或两个函数定义,我认为这是可行的。您真正的问题是如何让它发出有用的 asm 源文件,这些源文件可以进行轻微的手工修改和实际组装。

标签: c visual-studio assembly masm


【解决方案1】:

这样想:当您使用 MASM 时,您使用的是完全不同的语言,巧合的是,它在汇编代码中有一些重叠。

您可以要求 c 编译器向您显示生成的程序集,但该功能并非旨在用于交叉植入程序集代码:这只是为了避免您生成反汇编程序的麻烦,并手动提取你需要的东西。

c 编译器旨在将您的 c 代码以及您可能不知道的许多功能转换为执行您所要求的某些机器代码。这意味着生成的代码可能包含更多内容(例如 Helpers),并且可以链接到其他库(例如 msvc 运行时),因为这是 msvc 编译器的设计目的。

另一方面,如果您使用 MASM,则受众是需要控制一切的人。因此,您不再受益于 c 语言和运行时的特性和限制。

话虽如此,如果您需要这样做,请尽量专注于使用在线汇编,因为您仍然可以使用 c 或 c++ 等高级语言,同时保留在需要时弄乱汇编代码的能力它。

【讨论】:

  • 我认为你在这里为 MASM 找了太多借口。 GCC、clang 和 ICC 可以毫不费力地发出 AT&T 语法 .s,您可以使用独立的汇编器来汇编它以获得与编译器直接生成的相同的 .o。 (对于 GCC,编译器前端确实会生成一个 asm 文本文件作为中间步骤。)MSVC 没有理由不能创建一个 .asm,MASM 可以组装成一个可用的 @ 987654324@(您可以将其链接到与编译器相同的 CRT),它的设计目的不是为了在没有人工干预的情况下轻松实现。
猜你喜欢
  • 2012-03-22
  • 2010-10-24
  • 1970-01-01
  • 2016-04-22
  • 2021-12-29
  • 2013-08-01
  • 2020-11-11
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多