Arduino leçon 11 : compléments
Vous pouvez la sauter si le fonctionnement des microprocesseurs ne vous intéresse pas.

Connaissez-vous ULA ?
Non! il ne s'agit pas d'elle

mais d'elle

Unité Logique et Arthmétique ULA en français, ALU en anglais.
C'est une partie interne au microprocesseur et qui fait tous les calculs.
Les nombres sont sur les entrées 1 et 2, la réponse est en sortie.
Le code de l'instruction sélectionne le type d'opération (addition, soustraction, AND, OR, NAND, NOR, XOR, NOT, <, >, ==, <=, >= ...)
L'opération positionnne aussi des flags (drapeaux) qui sont de simples bits d'un registre.
Un de ces bits est set si le résultat est nul, un autre s'il est négatif, un autre s'il y a une retenue etc...
Pour les comparaisons, on ne s'occupe pas du résultat mais de l'état des flags.
Les opérations complexes comme la multiplication sont effectuées par des sous-programmes qui utilisent plusieurs fois de suite ULA.
Les registres et la Pile
Les pointeurs : le cas général
Un pointeur est une case mémoire qui contient une adresse.
|
les registres
Ce sont des zones de mémoire à l'intérieur du microprocesseur. Ils sont très utilisés par les programmes car leur temps de lecture ou
d'écriture est beaucoup plus rapide que la lecture en mémoire. Ils sont en nombre limité car ils reviennent cher à fabriquer.
exemples :
- le registre PC (Programm Counter) contient l'adresse de la prochaine instruction à appeler.
- le registre SP (Stack Pointer) contient le nombre d'adresses stockées dans la pile.
- le registre SR (State Register) est le registre d'état qui contient les flags.
Le verbe pointer signifie contenir l'adresse de quelquechose ou un indice permettant d'obtenir cette adresse.
la pile
La pile (Stack en anglais) est une zone de mémoire du microprocesseur prévue pour contenir des adresses. C'est donc une suite de pointeurs.
Ne pensez pas à une pile électrique mais à une pile d'assiettes.
Celle qu'on viendra chercher en premier est la dernière qu'on avait posée sur la pile.
On parle de système "LIFO" Last In First Out = dernier entré premier sorti.
Le registre SP contient la hauteur de la pile.
Chaque fois qu'on ajoute une adresse à la pile, le SP s'incrémente et il est décrémenté chaque fois qu'on retire une adresse.
Appel d'un sous-programme
Quand votre programme appelle un sous-programme :
- L'adresse de l'instruction suivante (qui était dans le Program Counter) est stockée sur le sommet de la pile
- le stack pointer SP s'incrémente
- l'adresse du début du sous-programme est placée dans la Program Counter.
La prochaine instruction exécutée sera donc la première du sous-programme.
Quand le programme arrive à l'instruction "return();"
- L'adresse qui est sur la pile est copiée dans le Programm Counter.
- le SP est décrémenté : il pointe sur l'avant dernière de la pile. (qui est devenue la dernière)
La prochaine instruction exécutée sera donc celle qui suivait l'appel du sous-programme.
Ce principe peut être à plusieurs niveaux : un sous-programme peut en appeler un autre.
Le nombre de niveaux ne doit pas dépasser la taille maximale de la pile. C'est rare, sauf en cas d'erreur de programmation :
appels dans une boucle qui se mord la queue.
Les pointeurs : le cas d'un indice
SP ne contient pas une adresse entière mais seulement un offset c'est-à-dire un décalage.
|
optimisation du temps d'exécution
Le compilateur va traduire votre programme en instructions pour le microprocesseur (langage machine)
Si vous écrivez a = a + 1 ;
le compilateur va écrire des instruction qui signifient :
- trouver l'adresse de la variable a
- mettre a sur une entrée d'ULA
- mettre 1 sur l'autre entrée
- mettre le code "addition" sur l'entrée de sélection
- trouver l'adresse de la variable a (il ne peut pas deviner que c'est la même qu'en entrée)
- mettre le résultat dans a
Si vous écrivez a += 1;
le compilateur va écrire des instruction qui signifient :
- trouver l'adresse de la variable a
- mettre a sur une entrée d'ULA
- mettre 1 sur l'autre entrée
- mettre le code "addition" sur l'entrée de sélection
- mettre le résultat dans a (là, il n'a pas besoin de chercher)
Si vous écrivez a ++;
le compilateur va écrire des instruction qui signifient :
- trouver l'adresse de la variable a
- l'incrémenter
Pas besoin de passer par ULA, donc gain de temps.
haut de la page

