从NASM到GAS的翻译

时间:2013-09-16 17:31:52

标签: assembly translation nasm gas

如何将mov [ebx], al从NASM翻译为GAS? 我试过了mov %al, (%ebx),但它确实是分段错误。

另一个问题,我可以说我在GAS中有一个数组.lcomm array, 50 我是否必须在array这样的mov %rbx, $array中添加一个美元($)符号:{{1}}或者不需要?

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

BTW,使用GAS,您可以使用.intel_syntax noprefix,但它的MASM风格不是NASM,因此mov eax, symbol是一个加载,而不是mov - 地址的即时。 (您在GAS mov eax, OFFSET symbol中需要.intel_syntax)。  有关NASM和MASM之间差异的更多信息,请参阅https://stackoverflow.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)

答案 3 :(得分:0)

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

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