4

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

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

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

4

4 回答 4

3

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
于 2013-10-29T10:44:16.643 回答
2

用 NASM 汇编,用反汇编objdump -d得到任何单个指令的 AT&T 语法版本。

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


顺便说一句,你可以使用 GAS .intel_syntax noprefix,但它是 MASM 风格而不是 NASM,所以mov eax, symbol是负载,而不是mov地址的 -immediate。(你需要mov eax, OFFSET symbolGAS .intel_syntax)。有关NASM 和 MASM 之间差异的更多信息,请参阅https://stackoverflow.com/tags/intel-syntax/info 。


mov [ebx], al并且是相同的指令:使用单独作为地址的单mov %al, (%ebx)字节存储。如果那是段错误,那么仅该指令就不是问题。其他说明有误,或者您有其他类型的问题。也许您将 GAS 代码组装为 64 位? 在 64 位系统(GNU 工具链)上组装 32 位二进制文​​件alebx

于 2017-12-27T07:12:33.050 回答
1

您可以使用 objdump(osx 上的 otool)反汇编成气体格式。

于 2017-12-27T01:34:38.397 回答
0

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

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

于 2013-09-16T17:47:51.617 回答