2015-12-14 1 views
0

J'ai un code d'assemblage en ligne avec deux petites lignes. Je veux utiliser l'opérande de sortie récupéré de la première ligne comme opérande d'entrée dans ma deuxième ligne. Je me demandais si c'était possible ou non. Voici mon code:Puis-je utiliser l'opérande de sortie comme entrée à l'intérieur de l'assemblage en ligne 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"); 

Comme vous pouvez le voir ici, je dois mullo2 opérande être celui de mon entrée dans la seconde instruction. Le compilateur ne s'en plaint pas, mais je n'obtiens pas de résultats corrects.

+0

Oui, vous pouvez. Examiner le code asm généré (en utilisant 'gcc -S' ou' objdump'). Indiquez également quelle entrée vous fournissez et quelle sortie vous obtenez et pourquoi cela n'est pas correct. – Jester

+0

Je ne sais pas si je comprends bien, mais: Si vous utilisez des registres à l'intérieur de ** la même instruction ** asm seulement, vous devez les lister dans la section clobber, mais pas comme entrée ou sortie. Sinon, si vous voulez changer un argument d'entrée, vous devez le faire entrer/sortir. Notez que l'utilisation de 'uint32' comme nom est une mauvaise idée, car cela peut facilement être confondu avec le type' uint32_t'. En général, utilisez des noms explicites, pas leurs types. – Olaf

+0

Notez également que les opérandes de sortie peuvent être affectés aux mêmes registres que les entrées, à moins que vous n'utilisiez early-clobber. Dans votre cas, '% 5' peut être identique à'% 0' ou '% 1' et comme ceux-ci sont détruits par la première instruction, votre seconde utilisera une valeur erronée. – Jester

Répondre

2

Les opérandes de sortie peuvent être affectés aux mêmes registres que les entrées, à moins que vous n'utilisiez early-clobber. Dans votre cas %5 peut être le même que %0 ou %1 et puisque ceux-ci sont détruits par la première instruction, votre deuxième utiliserait une valeur erronée. Ainsi, vous devez utiliser le modificateur early-clobber sur ces deux opérandes de sortie, tels que "=&r"(mullo2)