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