2013-09-16 30 views
2

我有一个用NASM语法编写的代码,运行良好。然后我使用intel2gas将我的NASM代码转换成GAS。 (使用-i,默认为英特尔至& t格式)。NASM to GAS语法使用intel2gas

我从来没有使用过GAS,只是纯粹的NASM在我所有的组装需求。我用intel2gas学习GAS代码格式。现在,我在转换后的GAS代码中有一行警告来自intel2gas,并附有'MISMATCH:'前缀。

我已经在.data和.bss段管理的其他人一样,但我仍然有这些:

MISMATCH: "lea ecx, [array + esi]" 
MISMATCH: "lea ebx, [array + esi + 1]" 
MISMATCH: "mov al, [array + esi]" 
MISMATCH: "mov cl, [array + esi + 1]" 

什么上面的NASM线相当于GAS语法?

为什么intel2gas没有完全转换我的代码,并留下了几个MISMATCH线?

请大家帮忙,谢谢!


使用Ubuntu 13 86

回答

2
lea ecx, [array + esi] 
lea ebx, [array + esi + 1] 
mov al, [array + esi] 
mov cl, [array + esi + 1] 

所有这些线路不使用恒定的从存储在寄存器地址偏移。从语法翻译器的角度来看,标签地址是未知的,它不能确定目标编译器使用什么配置。

翻译:

lea array(%esi), %ecx 
lea array+1(%esi), %ebx 
movb array(%esi), %al 
movb array+1(%esi), %cl 
+0

Whoaaa!谢啦! :D 我有一个后续问题,如果我可能.. 我有这样一行:'movb%cl,$ byte [ebx]'产生这个错误:表达后的垃圾'[ebx]'和无效的表达式'mov'后缀 我应该如何处理这个问题? –

+1

如果'byte'是一个在代码中声明的标签,那么它的名称前面不应该有'$',因为它只在常量之前。顺便说一句'[]'方括号在GAS语法中是不允许的,所以你可以使用:'movb%cl,byte(%ebx)'。 如果您在'ebx'之前写了'byte'作为大小说明符,请注意它根本无效并且没有必要。 'mov'后缀'b'已包含此信息。 – user35443

+0

ohhhh ..这个movb是真正的方便。 :D 非常感谢! :d –