J'ai (presque) fabriqué un ordinateur 😀
@_Akanoa_
https://lafor.ge
Yannick Guern
Genèse du projet
https://www.youtube.com/watch?v=As44YzdnqqE
Initiation concrète à la virtualisation
Samuel Ortiz,
Pierre-Antoine Grégoire
Julien Durillon
La vidéo qui m'a inspiré
Devoxx FR 2021
Mais, ça m'a fait me poser beaucoup de questions 😅
- Qu'est-ce qu'un ordinateur ?
- Comment se représente-t-il nos données ?
- Comment est-ce que l'on peut lui demander de faire des choses pour nous ?
- Comment fait-il plusieurs choses en même temps ?
Anatomie générale d'un ordinateur
Contenu de la Mémoire
Oui, mais en binaire
Entrées et sortie de la Mémoire
On raccroche les wagons
Un mémoire à 1 adresse : le registre
Additionneur binaire
Soustracteur binaire
OU logique
ET logique
Décalage binaire
Charger de la donnée depuis la mémoire dans un registre
Charger de la donnée depuis la mémoire dans un registre (2)
Stocker de la donnée depuis un registre dans la Mémoire
Stocker de la donnée depuis un registre dans la Mémoire(2)
UAL
Bus d'instructions
Somme
Somme (2)
Somme (3)
Charger
Charger (2)
Registres
On progresse
Instructions en Mémoire
Instructions binaires en Mémoire
Deux questions :
- Comment écrire le binaire ?
- Comment récupérer les instructions ?
Code d'Opération
Paramètres
Notre liste de course
Copier de la donnée
Déplacer de la donnée
Ajouter et soustraire
Ajouter et soustraire une valeur directe
Stocker de la donnée
Charger de la donnée
Arrêter les machines
Notre jeu d'instructions
Représentation des OpCodes
Représentation des variantes de valeurs
Représentation des Registres
Représentation de la valeur
Représentation binaire d'une instruction
Représentation binaire de l'OpCode
Représentation binaire du registre
Représentaion binaire du type de valeur
Un exemple
Un autre exemple
Flash âš¡
Un nouveau venu: le pointeur d'instruction
Rappel : lien UAL et UC
Le cycle d'une instruction
Fetch
Decode
Execute
Fetch (2)
Questions ?
Pause (5min)
Pré-requis pour programmer
Stocker 42
Persister 42
Persister 42 (2)
Mais où persister la donnée ?
Architecture Harvard
Architecture Von Neumann et overlap mémoire
La solution de l'offset mémoire
Segments mémoire
Fonctionnement d'une pile
Au Commencement, il n'y avait rien
Puis vient le 0 qui descendit du Ciel
ll se posa sur la Terre
Le 1 jaloux voulu rejoindre le 0
Puis le 2
Tout était stable
Mais le 2 ne voulait pas rester en place
Implémentation de la pile dans le CPU
Pointeur de pile
Instruction CPU d'empilement
C'est beaucoup trop long!!
Le registre SP et la Mémoire
Fetch de l'instruction MOV
Exécution du MOV
Fetch de l'instruction PUSH
Stockage en mémoire
On incrémente SP
Déplacement d'une nouvelle valeur dans le registre
Persistance de la nouvelle valeur
On incrémente SP
Comment récupérer les données empilées?
Instruction de dépilement
État de la pile
Dépilement de la pile dans le registre
On dépile tout
Une bonne chose de faite!
Les exécutions conditionnels de code
Le flag Zero
Si c'est égal alors Z=1
Jump Zéro
Une simple condition
Si les nombres sont égaux
alors le flag Z=1
Si le flag Z=1 alors Jump !! 😄
On ne rentre pas dans le bloc conditionnel
Si les nombres sont différents alors Z=0
On ne Jump pas 😟 et on exécute l'instruction suivante
Puis l'on sort du bloc
Flag Négatif
Si résultat de A-V est négatif alors N=1
Jump négatif
Une autre condition
On fait la soustraction
Le résultat est négatif, alors N=1
On ne rentre pas dans le bloc en sautant à l'instruction de fin de bloc
Le résultat n'est pas négatif
On ne saute pas
On sort avec le minimum des deux nombres
On commence à avoir un début de langage
Répétition d'instructions
Une boucle for
Diminution de verbosité de +=
Diminution de verbosité de -=
Saut sans condition
Première vérification de la condition
i est différent de 2
On ne saute pas
On incrémente i
On jump au début de la boucle
Et c'est reparti pour un tour
i est différent de 2
On ne saute pas
i vaut 2 maintenant
on revient au début de la boucle
Z = 1 car i = 2
On saute !
Et de 3 !! 🎉
Modularisation et réutilisation
Ajouter deux nombres et affecter le résultat
Une implémentation possible
Introduction de la notion de labels
Avant l'appel de add
Corps de la fonction
Retour de fonction
Affection de c
b devient c
Retour de fonction
Oups
Utilisation d'un registre pour stocker l'adresse de retour
Jump à l'adresse de retour
On sort et affecte à c
b devient c
On stocke la nouvelle adresse de retour
On jump
On affecte c
Rajoutons une difficulté: réutiliser b
On déroule
Sauf que b n'existe plus
On revient dans le temps
On push b pour ne pas le perdre
on défini y = c
On affecte c
On tente d'appeler a + b
On restaure b
On réalise a + b
On affecte a 😎
Un pattern se dessine
On enregistre la position avant appel de fonction
On restaure la position de retour
On jump
Et on se retrouve pile après l'appel
On simplifie le retour
On simplifie l'appel aussi
ça commence à ressembler à du code "classique"
Normalisation
On applique
Un élément perturbateur
Restauration de contexte
Dernière simplification pour la route
C'est bôôô !! 🤩
Human Ressource Machine
Faites vos retours ! 😎
Merci à toutes et tous 😃
@_Akanoa_
https://lafor.ge
Voxxed Lux 2024
By akanoa
Voxxed Lux 2024
- 119