【问题标题】:How to force usage of GNU assembler directives in a MASM format assembly file, and vice versa如何在 MASM 格式的汇编文件中强制使用 GNU 汇编指令,反之亦然
【发布时间】:2014-07-09 01:52:58
【问题描述】:

我有一个 MASM 格式的程序集文件,它是 C 库的一部分。我想让这个文件也在 *nix 上汇编,我们假设它会安装 gcc,因此使用 GNU 汇编器。

我遇到的问题是汇编指令;我想知道是否有办法让两个汇编器都理解相同的指令,或者至少从一些选项中进行选择。这里有一些希望:

http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

...但是当我意识到它是用于内联 ASM 时,它就破灭了。

在查看 Agner Fog 的手册时,提到了他的 'objconv' 工具,我可以使用它来获取我的目标文件,然后将其反汇编成我想要的形式。这显然没有我想象的那么干净。

感谢任何建议。谢谢, -mw

适用于 MASM 的示例,但我需要 GNUC 部分在通过“as”时包含“reg1 = rdi”等:

IFDEF _MSC_VER
    reg1 textequ <rcx>
    reg2 textequ <rdx>
    reg3 textequ <r8>
ELSEIFDEF __GNUC__
    reg1 textequ <rdi>
    reg2 textequ <rsi>
    reg3 textequ <rdx>
ELSE
    ;error
ENDIF

【问题讨论】:

  • 您的问题是汇编指令(如您所说)吗?还是 intel vs att 操作码方言?如果是方言,看看sourceware.org/binutils/docs/as/…
  • 是前者;我们知道“.intel_syntax 选择 Intel 模式”以及为什么它是必要的。出现的问题是汇编指令没有被类似的语法开关覆盖。
  • 很抱歉怀疑你。有时我会跳过简单的东西,通常会令我后悔。在没有看到一些细节的情况下,我不知道我还能提出什么建议(甚至那时也可能没有)。需要考虑的其他事项:“as”在 Windows 上可用。如果您必须选择一种格式,那么...
  • 例如:在 64 位 Windows 上编译的代码的函数调用约定要求使用某些寄存器来传递最多 4 个参数,其余的在堆栈上agner.org/optimize/optimizing_assembly.pdf,表 4.1。同一张表显示了需要保存和恢复的寄存器。我想使用预处理器指令:通过 ifdef 检查我使用的是哪个汇编器,并定义一些文本等同于别名必要的寄存器(这些指令在汇编器之间也有所不同)。如果这是可行的,那么需要与函数做的另一件显而易见的事情应该随之而来。
  • 嗯,我有一个想法。它有多丑,取决于你有多绝望。问自己这两个问题: 1) 如果你可以通过常规的 c 预处理器而不是蹩脚的、特定方言的 asm 来运行这个 asm 文件,你能做你想做的事吗? 2)你为什么不能这样做?例如,在 VS 中,添加一个包含当前 asm 内容的文件 foo.preasm,给它一个自定义构建类型,创建命令行:cl %(FullPath) -EP > %(Filename).asm 并设置输出:foo。汇编。您可以根据需要在该命令中添加 /D 条目。类似的方法应该适用于 *ix。

标签: c gcc assembly masm gnu-assembler


【解决方案1】:

上述 David Wohlferd 的解决方案有效。我只是在解决我的问题的上下文中构建它。

要使 Visual Studio 预处理这个包含 C 预处理器指令和 Intel 语法中的有效程序集(通过开关转换为 AT&T 语法)的文件,请进行预构建事件。在该事件中为您的项目添加“cl /EP topsecret.preasm > topsecret.asm”。

然后,为每个文件(您应该将其包含在项目源代码中)制作一个自定义构建事件(右键单击文件,转到属性,使其成为“自定义构建工具”类型的项目)。然后使命令行包含您想要的汇编程序命令行。例如,

"ml64.exe /c -D "MS_COMPILER" /Fo"topsecret.obj" "路径\to\topsecret.asm"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2021-03-04
    • 1970-01-01
    • 2014-06-19
    • 2011-08-06
    相关资源
    最近更新 更多