2016-11-18 330 views
1

我试图在Linux中使用nano文本文件转换内联汇编代码。GCC内联汇编错误

__asm__ ("MOV AX, morales1\n\t" 
     "MOV BX, morales2\n\t;" 
     "ADD AX, BX\n\t;" 
     "MOV morales, AX;" 
     ); 

士气1和2被签名为短裤。我收到以下错误:

"Error: ARM register expected -- mov AX,morales1'"`

+1

你在使用ARM芯片吗?您需要提供有效寄存器名称的芯片架构文档。 AX可能不适用于给定的目标架构。您可能从这里开始:http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf –

+1

ARM处理器需要ARM汇编代码,而不是x86汇编代码。 –

+0

是的,我是。即时通讯工作与覆盆子pi。所以格式不正确?像寄存器一样? – Brian

回答

0

您似乎对编译器的功能有些模糊。最简单的方法是,c编译器获取带有c指令的文件,并将它们转换为适合在特定处理器上执行的汇编语言指令。

但是那里有很多处理器,并且每个处理器家族都使用不同的汇编指令。 c编译器如何处理这个问题?答案是给定的编译器(通常)只支持单个输出格式。所以你可能有一个编译器输出x86代码,另一个输出x64,一个用于ARM,MIPS等。虽然他们都采用c语言输入文件,但他们每个都输出适合其目标的汇编指令。

这意味着编译器可以将常规c指令(case,break,printf,scanf等)转换为适当的汇编程序。但是,当您使用asm指令时,您告诉编译器不要执行任何c->汇编器转换。它必须完全输出您提供的特定汇编程序指令。

这一切与你的问题有什么关系?

如果您从一个平台(例如x86)获取汇编程序指令并尝试在另一个平台(如ARM)上使用它,您会发生什么情况?那么,主要发生的是它不起作用。 (作为一个虚构的例子)如果你试图使用add x, y和处理器期望u32.xadd x, x, y,它会变得非常困惑,并且把你的汇编器当成废话。

那么,你如何“修复”这个?那么,最明智的计划就是停止在你的c代码中使用汇编语言。它看起来像你只是想添加2个数字。 c已经有可以做到的说明。

强调:编写c代码并让编译器输出代码几乎总是更好的方法。尝试使用内联汇编需要您知道c语言,目标处理器的汇编语言以及特定编译器选择使用的接口规则(每个编译器似乎稍微有点不同)。这是很多知道和尝试做对的。而且(正如你所发现的那样)它使得从一个编译器/处理器转移到另一个痛苦的。

但是,如果您绝对需要必须使用使用汇编程序,您需要从学习处理器的汇编程序指令开始。谷歌搜索应该为这些说明提供各种资源。一旦你知道了,你可以更新你的asm命令以包含正确的说明。