Connectez-vous pour obtenir votre relevé et valider vos réponses.
Jour 08 : Séquence de Boot
C'est la panique au cluster : les iMacs n'arrivent plus à démarrer ! L'écran affiche une pomme pendant quelques secondes avant de s'éteindre et de recommencer indéfiniment.
Tu branches ton ordinateur portable en série sur l'un des Mac et tu parviens à extraire la séquence de boot (ton relevé d'entrée). Le code est écrit dans une sorte d'assembleur qui rappelle vaguement Corewar.
Le processeur exécute une instruction par ligne. Il en existe trois types :
acc(accumulateur) : augmente ou diminue la valeur d'un registre global (qui vaut 0 au départ), puis passe à l'instruction suivante.jmp(saut) : saute vers une nouvelle instruction relative à sa position actuelle.jmp +2saute l'instruction suivante,jmp -1retourne à l'instruction précédente.nop(aucune opération) : ne fait rien et passe simplement à l'instruction suivante.
Partie 1
Le problème saute aux yeux : le programme tourne dans une boucle infinie. Il n'atteint jamais la fin du fichier et se contente de réexécuter en boucle la même séquence d'instructions.
Exemple
Considère ce petit programme de test :
nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6Voici comment il s'exécute, instruction par instruction :
- Ligne 1 :
nop +0— Ne fait rien. (Accumulateur = 0) - Ligne 2 :
acc +1— Accumulateur passe à 1. - Ligne 3 :
jmp +4— Saute 4 lignes plus bas (vers la ligne 7). - Ligne 7 :
acc +1— Accumulateur passe à 2. - Ligne 8 :
jmp -4— Saute 4 lignes plus haut (vers la ligne 4). - Ligne 4 :
acc +3— Accumulateur passe à 5. - Ligne 5 :
jmp -3— Saute 3 lignes plus haut (vers la ligne 2). - Ligne 2 :
acc +1— STOP ! C'est une instruction que nous avons déjà exécutée.
Juste avant que le programme ne réexécute la ligne 2 pour la seconde fois, l'accumulateur valait 5.
Lance ton propre fichier de boot dans un simulateur. Quelle est la valeur de l'accumulateur juste avant qu'une instruction ne soit exécutée pour la deuxième fois ?