2016-11-18 2 views
1

Je suis en train de convertir le code d'assemblage en ligne en utilisant nano textfile sous Linux.Erreur d'assemblage en ligne GCC

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

Avec morales 1 et 2 signant des shorts. Je reçois l'erreur suivante:

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

+1

Travaillez-vous sur une puce ARM? Vous aurez besoin de la documentation pour l'architecture de la puce qui fournira les noms de registre valides. AX peut ne pas être pour l'architecture cible donnée. Vous pouvez commencer ici: http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf –

+1

Les processeurs ARM ont besoin du code d'assemblage ARM, pas du code d'assemblage x86. –

+0

ouais je suis. Je travaille avec un pi de framboise. donc le format est incorrect? comme les registres? – Brian

Répondre

0

Vous semblez être un peu floue sur ce qu'est un compilateur fait. À son plus simple, un compilateur c prend des fichiers avec des instructions c et les convertit en instructions de langage d'assemblage appropriées pour l'exécution sur un processeur spécifique.

Mais il y a beaucoup de processeurs là-bas, et chaque famille de processeurs utilisent des instructions de montage différentes. Comment un compilateur c peut-il faire face à cela? La réponse est qu'un compilateur donné (typiquement) ne supporte qu'un seul format de sortie. Vous pouvez donc avoir un compilateur qui génère un code pour x86, un autre pour x64, un pour ARM, MIPS, etc. Alors qu'ils prennent tous un fichier d'entrée en langage C, ils affichent chacun les instructions d'assembleur appropriées pour sa cible.

Cela signifie que les instructions régulières de c (cas, coupure, printf, scanf, etc.) le compilateur peut se traduire par assembleur approprié pour vous. Toutefois, lorsque vous utilisez l'instruction asm, vous demandez au compilateur de ne PAS effectuer de traduction c-> assembleur. Il doit produire exactement les instructions d'assembleur spécifiques que vous fournissez.

Qu'est-ce que tout cela a à voir avec votre question?

Que pensez-vous que se produit si vous prenez les instructions assembleur d'une plate-forme (x86 dire) et essayez de l'utiliser sur une autre plate-forme (par exemple ARM)? Eh bien, ce qui se passe surtout c'est que ça ne marche pas. (Comme un exemple fictif) si vous essayez d'utiliser add x, y et le processeur attend u32.xadd x, x, y, il va devenir vraiment confus, et il suffit de traiter votre assembleur comme un non-sens.

Alors, comment vous «réparer» cela? Eh bien, le plan le plus sensé serait d'arrêter d'essayer d'utiliser le langage assembleur dans votre code c. Il semble que vous essayez juste d'ajouter 2 chiffres. c a déjà des instructions qui peuvent le faire.

Insister: l'écriture de code c et laisser le code de sortie du compilateur est presque toujours la meilleure approche. Essayer d'utiliser l'assemblage en ligne nécessite que vous connaissiez le langage c, le langage d'assemblage pour votre processeur cible et les règles d'interface entre les deux que votre compilateur spécifique a choisi d'utiliser (chaque compilateur semble faire cela différemment). C'est beaucoup à savoir et essayer de bien faire les choses. Et (comme vous l'avez découvert) cela rend douloureux le passage d'un compilateur/processeur à un autre.

Mais si vous devez utiliser , vous devez commencer par apprendre les instructions de l'assembleur pour votre processeur. Une recherche google devrait trouver une variété de ressources pour ces instructions. Une fois que vous avez appris cela, vous pouvez mettre à jour votre commande asm pour contenir les instructions correctes.