【发布时间】: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