2009-06-27 4 views
4

J'essaie d'implémenter le changement de contexte en utilisant gcc pour les processeurs m68k. J'ai besoin d'utiliser l'assemblage en ligne pour sauvegarder tous les registres d0, d1 ... d7 et a0, ... a7. Je me demandais si je pouvais utiliser une boucle dans mon gcc en ligne qui me permettrait de sauvegarder ces registres au lieu d'écrire une ligne de code séparée pour chaque registre.gcc assembly en ligne pour le changement de contexte

par ex.

move.l% d0, temp = pcb.cpuregs.d0 température

je veux faire 0 à l'intérieur d0 comme un compteur de boucle.

Répondre

1

Vous ne pouvez pas utiliser de boucle de style C dans le bloc asm. Mais vous pouvez utiliser votre code C pour construire une chaîne et transmettre cela à asm.

2

Vous pouvez envisager des macros:

#define SAVE_REG_DXX(no) __asm__ __volatile__("move.l %%d" #no ", %0" : "=g" (pcb.cpuregs.d ## no)) 

SAVE_REG_DXX(0); 
SAVE_REG_DXX(1); 
SAVE_REG_DXX(2); 

#undef SAVE_REG_DXX 
4

Ici, vous allez:

MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack. 

Vous ne devez pas utiliser la pile, vous pouvez utiliser une autre adresse.
J'ai l'impression que le mode pré-décrément est obligatoire,
mais je ne peux pas le tester maintenant car je n'ai pas de machine 68k.

p.s. Ce n'est probablement pas un dialecte gcc, vu que gcc n'existait pas quand
J'ai écrit ce code, mais je suis sûr que vous pouvez le comprendre. Pourquoi ne pas utiliser setjmp à la place de l'assemblage en ligne?

p.
alors votre sélecteur de contexte serait semi-portable.

+1

Oui, vraiment, utilisez setjmp. Si vous pouvez éviter le code d'assemblage, faites-le. –

+0

Je suis en train de faire quelque chose de similaire: placer des pointeurs de coroutines sur leurs propres espaces de pile avant de les appeler, pour lesquels 'setjmp' est insuffisant. Est-ce que cela peut être mis dans une fonction inline qui peut être garantie inline, ou faut-il utiliser une macro, pour éviter un appel fonctionnel (et des mutations associées dans les registres que nous voulons sauvegarder)? – Alexander

+0

Cela dépend de votre compilateur, mais cela ressemble exactement à ce que vous utiliseriez pour l'assemblage en ligne. –

Questions connexes