2015-12-14 100 views
0

我有一个内联汇编代码,有两条小线。我想在第二行中使用从第一行检索的输出操作数作为输入操作数。我想知道是否有可能。这里是我的代码:我可以使用输出操作数作为ARM内联汇编中的输入吗?

asm volatile( "umull   %0, %1, %3, %4; \n\t" 
       "adds   %2, %5, %0;  \n\t" 
       :"=r"(mullo2), "=r"(mulhi2), "=r"(temp) 
       :"r"(A), "r"(B->uint32[6]), "r"(mulhi1) 
       :"cc"); 

正如你可以看到这里,我需要mullo2操作数是我的第二个指令输入的一个。编译器不会抱怨,但不知何故,我没有得到正确的结果。

+0

是的,您可以。检查生成的asm代码(使用'gcc -S'或'objdump')。还要指定您提供的输入以及您得到的输出以及为什么不正确。 – Jester

+0

不知道我是否理解正确,但是:如果您仅在**相同的''asm'语句中使用寄存器,则必须将它们列在clobber部分中,但不能作为输入或输出。否则,如果您想更改输入参数,则必须将其输入/输出。请注意,使用'uint32'作为名字是一个坏主意,因为这很容易与'uint32_t'类型混淆。一般来说,使用自解释的名称,而不是它们的类型。 – Olaf

+0

另请注意,输出操作数可能会被分配到相同的寄存器作为输入,除非您使用early-clobber。在你的情况下,'%5'可能与'%0'或'%1'相同,并且由于这些被第一条指令破坏,你的第二条将会使用错误的值。 – Jester

回答

2

输出操作数可能被分配到相同的寄存器作为输入,除非您使用early-clobber。在你的情况下,%5可能与%0%1相同,并且由于这些被第一条指令破坏,您的第二条指令将使用错误的值。因此,您应该在这两个输出操作数上使用早期clobber修饰符,如"=&r"(mullo2)

相关问题