2015-12-14 37 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)

相關問題