GCC内联汇编错误

时间:2016-11-18 19:46:03

标签: inline-assembly

我试图在Linux中使用nano textfile转换内联汇编代码。

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

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

  

"错误:预期ARM寄存器 - mov AX,morales1'"`

1 个答案:

答案 0 :(得分: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命令以包含正确的说明。