Adloun

NSI (terminale) · Chapitre 15 · Exercice de TD

Problème — Un ordinateur à programme enregistré, en Python

Histoire de l'informatique · niveau 3 (difficile)

Énoncé

Problème — Un ordinateur à programme enregistré, en Python.

On reconstitue une machine minimale conforme au rapport de 1945. Sa mémoire est une liste de entiers ; les instructions y sont rangées comme les données. Une instruction est un entier de la forme , avec le jeu d'instructions suivant, où acc désigne l'accumulateur et co le compteur ordinal :

CodeNomEffet
0STOParrêter la machine
1CHARGE aacc memoire[a]
2RANGE amemoire[a] acc
3AJOUTE aacc acc + memoire[a]
4SOUSTRAIT aacc acc - memoire[a]
5SAUTE aco a
6SAUTE_SI_POSITIF asi acc > 0, alors co a
  • Écrire la fonction executer(memoire) qui applique le cycle « lire, décoder, exécuter » jusqu'à l'instruction STOP.
  • Dérouler les trois premières instructions du programme donné ci-dessous, qui calcule .
  • Que contient la case à la fin ?
  • Écrire trois instructions qui modifient une instruction du programme. Que montre cette possibilité, et pourquoi l'évite-t-on aujourd'hui ?

Corrigé de la question 1

1. La machine. Le cycle tient en une dizaine de lignes : c'est exactement le schéma de l'architecture à programme enregistré.


def executer(memoire):
    acc = 0          # accumulateur
    co = 0           # compteur ordinal
    while True:
        instruction = memoire[co]
        code = instruction // 100
        adresse = instruction % 100
        co = co + 1                      # on avance AVANT d'executer
        if code == 0:
            return memoire
        elif code == 1:
            acc = memoire[adresse]
        elif code == 2:
            memoire[adresse] = acc
        elif code == 3:
            acc = acc + memoire[adresse]
        elif code == 4:
            acc = acc - memoire[adresse]
        elif code == 5:
            co = adresse
        elif code == 6:
            if acc > 0:
                co = adresse

Le programme s'écrit directement en nombres, puisque c'est ainsi qu'il est rangé :


memoire = [0] * 100
memoire[0] = 121   # CHARGE 21          acc <- somme
memoire[1] = 320   # AJOUTE 20          acc <- somme + n
memoire[2] = 221   # RANGE 21           somme <- acc
memoire[3] = 120   # CHARGE 20          acc <- n
memoire[4] = 422   # SOUSTRAIT 22       acc <- n - 1
memoire[5] = 220   # RANGE 20           n <- acc
memoire[6] = 600   # SAUTE_SI_POSITIF 0 si n > 0, on recommence
memoire[7] = 0     # STOP
memoire[20] = 5    # n
memoire[21] = 0    # somme
memoire[22] = 1    # la constante 1

executer(memoire)
print(memoire[21])   # affiche 15

Question 2 : comment l'IA t'aide

2. Dérouler les trois premières instructions du programme donné ci-dessous, qui calcule .

Élève

Pour dérouler, je dois prendre les instructions une par une dans la mémoire. Mais je ne sais pas trop comment retrouver le code et l'adresse à partir du nombre 121.

IA

C'est bien de commencer par là. L'énoncé te donne la forme d'une instruction : . Quelles opérations te permettent d'extraire le code et l'adresse d'un entier comme ?

Élève

Je peux faire la division entière par 100 pour le code, et le reste pour l'adresse. Pour 121, ça donne code 1 et adresse 21. Ensuite je regarde dans le tableau ce que fait le code 1.

IA

Exact. Et le tableau te dit que le code correspond à CHARGE : l'accumulateur reçoit la valeur de la case . Avant de passer à l'instruction suivante, quelle est la valeur de la case au départ, et que devient l'accumulateur après cette première instruction ?

L'IA ne donne pas la réponse : elle pose la question qui fait avancer. À toi de continuer.

Continue cet exercice avec l'IA

Reprends la question 2 là où le dialogue s'arrête, puis la suite de l'exercice.

Continuer avec l'IA — gratuit, sans inscription

Gratuit, sans inscription. L'IA te guide pas à pas, sans te donner la réponse.

Le cours du chapitre · Tous les exercices du chapitre

Continuer avec l'IA, gratuit →