从 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], al
和 mov %al, (%ebx)
是相同的指令:al
的一个字节存储,仅使用 ebx
作为地址。如果那是段错误,那么仅该指令就不是问题。其他说明有误,或者您有其他类型的问题。也许您将 GAS 代码组装为 64 位? Assembling 32-bit binaries on a 64-bit system (GNU toolchain).
【讨论】:
以上是关于从 NASM 到 GAS 的翻译的主要内容,如果未能解决你的问题,请参考以下文章