从 NASM 到 GAS 的翻译

Posted

技术标签:

【中文标题】从 NASM 到 GAS 的翻译【英文标题】:Translation from NASM to GAS 【发布时间】:2015-01-13 09:13:36 【问题描述】:

如何将mov [ebx], al 从 NASM 转换为 GAS? 我试过mov %al, (%ebx),但它确实出现了段错误。

另一个问题,假设我在 GAS 中有一个数组 .lcomm array, 50 我是否必须像这样在array 中输入美元($)符号:mov %rbx, $array 还是不需要?

任何答案都会有所帮助:)

【问题讨论】:

用 NASM 汇编,用objdump -d 反汇编(或者用objconv 得到一个你可以实际汇编的文件。 【参考方案1】:

首先,mov %al, %ecx 不会出错,因为它没有访问内存。地狱,它甚至不应该组装,因为它们的大小不同。 也就是说,您的 nasm 代码的正确翻译是 mov %al, (%ecx),它将把 al 写入内存地址 ecx

对于另一个问题:如果你想引用地址,你需要$。因此,mov %rbx, $array 无效,因为您无法分配地址。如果要将rbx 存储到数组的第一项中,请写入mov %rbx, array。如果要加载第一项,请使用mov array, %rbx。如果要加载第一项的地址,请使用mov $array, %rbx 或使用lea,这是特殊的,不需要$

【讨论】:

很好,谢谢。对不起,我错过了一些东西。我试过了,它适用于 ecx 但不适用于 ebx。我已经尝试过 mov %al, (%ebx) 和 movb %al, (%ebx),仍然会出现段错误。我该怎么办? 这意味着ebx 的地址无效。也许你没有用地址加载它。我只能猜测而没有看到整个代码。还有,应该是64位码,ebx感觉不对。 好吧,我做了类似的事情:push %ebx 和 pop %ebx 然后在 pop 之后,它确实出现了段错误。有什么问题吗?【参考方案2】:

intel2gas怎么样?

usage: intel2gas [options] [-o outfile] [infile]
where options include:
    -h        this help
    -i        convert from intel to at&t format (default)
    -g        convert from at&t to intel format
    -m -t     convert from masm/tasm to at&t format
    -c        understand C style comments
    -I        convert inline assembler (intel to at&t only)
    -d        output all % chars as %%
    -V        show version
    infile and outfile default to stdin/stdout

【讨论】:

Intel2gas 现在位于 github:github.com/skywind3000/Intel2GAS 哇...这个工具太糟糕了。【参考方案3】:

你可以使用objdump(osx上的otool)来反汇编成gas格式。

【讨论】:

它是 Intel 语法,但它是 MASM 样式,而不是 NASM。例如mov eax, symbol 是 GAS 和 MASM 中的内存加载,但 NASM 中的地址是 mov-immediate。见***.com/tags/intel-syntax/info。【参考方案4】:

用 NASM 汇编,用objdump -d 反汇编以获得任何一条指令的 AT&T 语法版本。

或者使用 Agner Fog 的 objconv 反汇编成带有 GAS AT&T 语法的 .S 文件,您实际上可以直接组装。 (它将标签放在分支目标上)。不过,它仍然不能真正处理转换数据,我认为主要是代码。


顺便说一句,对于 GAS,您可以使用 .intel_syntax noprefix,但它是 MASM 样式而不是 NASM,所以 mov eax, symbol 是一个负载,而不是地址的直接 mov。 (您需要在 GAS 中使用 mov eax, OFFSET symbol .intel_syntax)。 有关 NASM 和 MASM 之间差异的更多信息,请参阅https://***.com/tags/intel-syntax/info。


mov [ebx], almov %al, (%ebx) 是相同的指令:al 的一个字节存储,仅使用 ebx 作为地址。如果那是段错误,那么仅该指令就不是问题。其他说明有误,或者您有其他类型的问题。也许您将 GAS 代码组装为 64 位? Assembling 32-bit binaries on a 64-bit system (GNU toolchain).

【讨论】:

以上是关于从 NASM 到 GAS 的翻译的主要内容,如果未能解决你的问题,请参考以下文章

如何将此代码从 Intel(nasm) 转换为 AT&T(gas) 语法?

NASM TO GAS:对应于 GAS 中的 resw

NASM 与 GAS(实际差异)

NASM汇编学习系列——示例打印0到10

NASM汇编学习系列——获取命令行参数

NASM汇编学习系列——使用bss段和获取用户输入