Michaël Devyver Gaspard Pardon Cours du 8 novembre 2005 Résumé : génération de code assembleur But du cours : Comprendre les mécanismes utilisés par le compilateur pour transformer le code C en code assembleur. Main : Le « main » du code C, transformé en code assembleur n’a pas de sens s’il n’est pas initialisé. Le compilateur va ajouter les sous-routines d’initialisation du microcontrôleur. C’est le but du code après l’étiquette « _reset ». cf p. 4 Variables : - Locales : Link/Unlink : La déclaration d’une variable locale en C produit une allocation de mémoire (sur la pile) en assembleur par la commande LNK/ULNK. Le compilateur tient compte du type des variables et de leur nombre pour connaître le nombre d’octets à réserver en mémoire (p. ex. int = 2 octets, float = 4 octets, etc…). Cette commande est utilisée pour déclarer des variables locales à une fonction. « Unlink » sert à libérer l’espace utilisé lors de la fonction. cf p.6 - Globales et « static » : L’espace utilisé par ces variables (dans la RAM) reste bloqué lors de toute l’exécution du programme. Mais celles-ci peuvent être modifiées en tout temps. Le type de la variable détermine l’espace à réserver sur la RAM. cf p.8 Boucles et conditions : Le corps central du code assemblé des fonctions « for », « while », « do while » et « if » est partiellement le même. Il comporte à chaque fois une suite d’instructions, à savoir : mov subr bra #« valeur comparée de branchement », w0 w0,[pointeur sur variable],[w15] « type de branchement », « nom de la sous-routine de sortie » cf p 12-15 Appel de fonction : RCALL et RETURN RCALL enregistre sur la pile l’adresse de l’instruction suivante (PC+2) : c’est l’adresse vers laquelle le RETURN renvoie à la fin de la sous-routine appelée. Ensuite, la commande RCALL place le Program Counter (PC) en début de code de la sous-routine appelée pour son exécution. cf p.17 Passage de paramètres : Les paramètres des fonctions en langage C sont passées, en assembleur, par le biais de registres w0, w1, w2, etc. La valeur de retour d’une fonction est passée par w0. cf p. 21 Par exemple : mov mov mov rcall #1, w2 [w14+2], w1 [w14], w0 _routine