Résumé : génération de code assembleur

publicité
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
Téléchargement