如何mov [ebx], al
从 NASM 转换为 GAS?我试过mov %al, (%ebx)
了,但它确实出现了分段错误。
另一个问题,假设我在 GAS 中有一个数组.lcomm array, 50
我必须像这样输入一个美元($)符号array
:mov %rbx, $array
还是不需要?
任何答案都会有所帮助:)
如何mov [ebx], al
从 NASM 转换为 GAS?我试过mov %al, (%ebx)
了,但它确实出现了分段错误。
另一个问题,假设我在 GAS 中有一个数组.lcomm array, 50
我必须像这样输入一个美元($)符号array
:mov %rbx, $array
还是不需要?
任何答案都会有所帮助:)
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
用 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 symbol
GAS .intel_syntax
)。有关NASM 和 MASM 之间差异的更多信息,请参阅https://stackoverflow.com/tags/intel-syntax/info 。
mov [ebx], al
并且是相同的指令:使用单独作为地址的单mov %al, (%ebx)
字节存储。如果那是段错误,那么仅该指令就不是问题。其他说明有误,或者您有其他类型的问题。也许您将 GAS 代码组装为 64 位? 在 64 位系统(GNU 工具链)上组装 32 位二进制文件。al
ebx
您可以使用 objdump(osx 上的 otool)反汇编成气体格式。
首先,mov %al, %ecx
不能真正出错,因为它没有访问内存。地狱,它甚至不应该组装,因为它们的大小不同。也就是说,您的 nasm 代码的正确翻译是mov %al, (%ecx)
将其写入al
内存的 address ecx
。
对于另一个问题:$
如果要引用地址,则需要。因此,mov %rbx, $array
无效,因为您无法分配地址。如果要存储rbx
到数组的第一项,请写入mov %rbx, array
. 如果要加载第一项,请使用mov array, %rbx
. 如果要加载第一项的地址,请执行mov $array, %rbx
或使用lea
特殊且不需要$
.