如何将mov [ebx], al
从NASM翻译为GAS?
我试过了mov %al, (%ebx)
,但它确实是分段错误。
另一个问题,我可以说我在GAS中有一个数组.lcomm array, 50
我是否必须在array
这样的mov %rbx, $array
中添加一个美元($)符号:{{1}}或者不需要?
任何答案都会有所帮助:)
答案 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], al
和mov %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
,这是特殊的,不需要$
。