Trois milliards de pas par seconde
Un processeur de téléphone annoncé à 3 GHz bat trois milliards de fois par seconde. À chaque battement, il avance d'un tout petit pas.
Une instruction est très simple, par exemple « additionne ces deux nombres ». Et chaque instruction passe par les trois mêmes étapes. Aujourd'hui, tu les suis une par une.
À la fin de cette leçon
Remarque
Je peux suivre le cycle chargement, décodage, exécution d'un processeur.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Instruction | un petit pas que le processeur sait faire | add a0, a0, a1 |
| Adresse mémoire | le numéro d'une case de la mémoire | |
| Registre | une toute petite mémoire très rapide dans le processeur | a0 |
| Compteur ordinal | le registre qui garde l'adresse de la prochaine instruction | |
| Assembleur | les instructions du processeur écrites en mots courts | |
| Cycle | les mêmes étapes, répétées sans arrêt |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ce qu'il y a dans un processeur
Un programme attend en mémoire sous forme d'une liste d'instructions. Chacune est rangée à sa propre adresse mémoire.
Le processeur a une unité de commande, qui lit chaque instruction et décide quoi faire. Il a une unité arithmétique et logique (UAL), faite de portes comme à la leçon précédente, qui calcule et compare. Et il a des registres, qui gardent les nombres en cours de calcul.
Les parties et leur rôle
| Partie | Son rôle |
|---|---|
| Mémoire | Garde le programme et ses données |
| Compteur ordinal | Garde l'adresse de la prochaine instruction |
| Unité de commande | Comprend ce que veut dire une instruction |
| UAL | Fait les additions, les soustractions et la logique |
| Registres comme a0 et a1 | Gardent les nombres en cours de calcul |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Charger, décoder, exécuter, et recommencer
Chargement : le processeur copie l'instruction rangée à l'adresse du compteur ordinal. Le compteur passe à l'adresse suivante.
Décodage : l'unité de commande comprend ce que l'instruction demande. Exécution : le processeur le fait, par exemple l'UAL additionne deux registres. Puis le cycle recommence.
Avant de commencer
Remarque
Appuie sur Start the lab dans la barre en haut et attends que la machine soit prête. Le programme que tu vas lire est écrit pour un processeur RISC-V. La machine du lab n'est pas RISC-V, donc un émulateur le fait tourner.
Va dans le dossier arch
cd ~/archAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lis un programme de cinq instructions
cat add.sAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Change les mots en code machine
riscv64-linux-gnu-as add.s -o add.oAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Fais-en un programme
riscv64-linux-gnu-ld add.o -o addAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Vois chaque instruction à son adresse
riscv64-linux-gnu-objdump -d addAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple : suivre le programme
| Compteur ordinal | Instruction | Ce que fait l'exécution | a0 | a1 |
|---|---|---|---|---|
| 100b0 | li a0,2 | met 2 dans a0 | 2 | ? |
| 100b4 | li a1,3 | met 3 dans a1 | 2 | 3 |
| 100b8 | add a0,a0,a1 | l'UAL les additionne dans a0 | 5 | 3 |
| 100bc | li a7,93 | choisit la demande qui arrête le programme | 5 | 3 |
| 100c0 | ecall | demande à Linux d'arrêter, avec le code a0 | 5 | 3 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent que le compteur ordinal compte combien d'instructions ont tourné. Il garde l'adresse de la prochaine. Ici, il avance de 4 à chaque fois, car chaque instruction fait 4 octets. Un saut y met une autre adresse.
Copie le programme, 40 au lieu de 2
sed 's/a0, 2/a0, 40/' add.s > quarante.sAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Assemble ta copie
riscv64-linux-gnu-as quarante.s -o quarante.oAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Fais l'édition de liens de ta copie
riscv64-linux-gnu-ld quarante.o -o quaranteAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Prévois, puis lance-la sur l'émulateur
qemu-riscv64 ./quaranteAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lis le résultat qu'elle a laissé
echo $?Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin : ce que voit l'émulateur
Appuie sur Open terminal et tape qemu-riscv64 -d in_asm ./add. L'émulateur affiche chaque instruction au moment où il la lit, avec son adresse.
Compare avec objdump. Que devient li a0,2 ? Pourquoi un processeur peut-il se passer d'une instruction « li » ?