Michaël Devyver Cours du 8 novembre 2005
Gaspard Pardon
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, transfor 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 #« valeur comparée de branchement », w0
subr w0,[pointeur sur variable],[w15]
bra « 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 #1, w2
mov [w14+2], w1
mov [w14], w0
rcall _routine
1 / 1 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !