2009-10-21 6 views
1

Nous travaillons sur un système d'exploitation de jouet en tant qu'affectation pour une classe. Je rencontre des problèmes avec l'écriture de la fonction de panique du noyau.Inclus dans l'assemblage en ligne

Il devrait enregistrer tous les registres, appeler une fonction de type printf, puis imprimer les registres enregistrés et arrêter le processeur. il est en ce moment défini comme une macro:

#define panic(...) \ 
    do{ \ 
     asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \ 
     _panic_printk(&_panic_context, __VA_ARGS__); \ 
    while(0) 

_panic_context est une variable globale qui contient les registres sauvegardés d'un fil et un peu plus de choses. Le problème est avec SAVE_REGISTERS. C'est une macro définie quelque part dans un fichier d'en-tête assembleur, mais je ne sais pas comment l'inclure. #include simple dans le fichier ne fonctionne évidemment pas. J'ai essayé de googler et d'écrire des choses drôles et désespérées (comme #include dans les chaînes de l'assembleur :-)) mais rien n'a aidé. Avez-vous des idées pour résoudre ce problème?

Nous utilisons GCC et compiler pour MIPS (en cours d'exécution dans un :-) simulateur)

modifier: SAVE_REGISTERS est défini avec .macro SAVE_REGISTERS .... Il ne peut pas être dans une macro C, car il est utilisé dans d'autres modules d'assemblage. Je ne peux pas faire un fichier .S avec, parce que la panique doit être variée. Ou au moins, je ne pouvais pas trouver d'autre moyen de le faire.

+0

Comment exactement est 'SAVE_REGISTERS' défini? –

Répondre

3

Je pense que vous êtes mal compris comment fonctionnent les macros. Ils sont étendus avant toute autre compilation. Vous ne pouvez pas utiliser asm pour émettre du code qui contient une macro car cette macro ne sera jamais développée.

Au lieu de cela, vous pouvez essayer de définir SAVE_REGISTERS comme une macro C qui utilise l'instruction asm pour construire votre code assembleur:

#define SAVE_REGISTERS(x) \ 
    asm volatile ("movx ax, %1", ...); 

alors vous pouvez le faire

#define panic(...) \ 
do { \ 
    SAVE_REGISTERS(_panic_context); \ 
    _panic_printk(&_panic_context, __VA_ARGS__); \ 
} while(0); 
+0

Le do-loop factice est de s'assurer qu'il y a un point-virgule après la macro, me semble-t-il. –

+3

La do-loop factice est une technique courante dans les macros multi-instructions qui leur permet de se comporter correctement lorsqu'elles sont utilisées dans des instructions 'if', par exemple. Il devrait être laissé dans la macro (mais l'accolade fermante devrait être ajoutée). Voir http://stackoverflow.com/questions/154136/why-are-there-sometimes-meaningless-do-while-and-if-else-statements-in-cc-macr –

+0

Ah OK, je n'étais pas au courant de cette convention. Edited la réponse. Merci. –

1

Je n'ai pas un système MIPS qui traînent, mais sur ma boîte x86 loonix J'ai essayé #include et découvert que # est le caractère de commentaire, donc j'ai essayé .include et qui a fonctionné dès que je citais le nom du fichier: .include "something.i" . Maintenant, si vous avez des fichiers d'en-tête et une infrastructure organisée pour le code assembleur, je dois me demander pourquoi vous voulez faire cela avec inline asm en premier lieu, cependant. Pourquoi ne pas simplement créer un vrai fichier .s ou .S, inclure le fichier d'en-tête assembleur et en faire un module de première classe dans votre système?

Je l'ai vu de petits chefs-d'œuvre fait avec asm même dans des projets qui avaient déjà un locore.S dans leur Makefile, allez comprendre ...

Questions connexes