Vote utilisateur: 3 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles inactivesEtoiles inactives
 

NSI - Numérique et Sciences Informatiques


Mémoire et langage machine


En son coeur, la machine effectue des calculs à partir d'instructions simples en binaire qui peuvent être directement traduites dans un langage, l'assembleur.
L'assembleur prend, traite et remplit des cases mémoires.

Avant de consultez cette page, il est conseillé de lire celle consacrée à l'architecture de von Neumann.

 

I. Organisation de la mémoire

I.1. Les différents types de mémoire

Il existe de nombreux mécaniques de mémoires qui se distinguent par leur durabilité (volatile ou permanente), leur mode d'accès (par adresse ou dans l'ordre de rangement).

Mémoire vive RAM (Random Acces Memory)

  • La mémoire vive (RAM) est une mémoire volatile (qui perd ses données lorsqu'on coupe son alimentation électrique).
  • Il s'agit des registres, des mémoires cache, de la mémoire centrale.
  • Il y a deux types principaux de mémoire vive :

    • la mémoire vive dynamique (DRAM) qui, même sous alimentation électrique, doit être réactualisé périodiquement pour éviter la perte d'information ;
    • la mémoire vive statique (SRAM) qui n'a pas besoin d'un tel processus lorsque sous alimentation électrique.

memoire vive RAM
Deux barrettes de mémoire de 512 Mio chacune

Mémoire morte ROM (Read-Only Memory )

  • La mémoire morte (ROM) est une mémoire non volatile (mémoire rémanente qui conserve ses données même lorsqu'on coupe son alimentation électrique).
  • Par exemple les disque SSD (Solid State Drive), les disques magnétiques.
  • Les mémoires mortes sont utilisées, entre autres, pour stocker :

    • les informations nécessaires au démarrage d’un ordinateur (BIOS, instructions de démarrage, microcode);
    • des tables de constantes ou des tables de facteurs de conversion ;
    • Elle fait aussi partie des microprogrammes présents dans les ordinateurs et la plupart des appareils électroniques (smartphone, baladeur et autres lecteurs de CD/DVD) mais aussi la plupart des appareils programmables (TV, réveil, machine à laver, lave vaisselle, etc.).
        

    Le temps d’accès à la mémoire morte est de l’ordre de grandeur de 150 nanosecondes comparativement à un temps d’accès d’environ 10 nanosecondes pour la mémoire vive. Pour accélérer le traitement des informations, les données stockées dans la mémoire morte sont généralement copiées dans une mémoire vive avant d’être traitées.
    On appelle cette opération le shadowing.

memoire ROMROM (Read-Only Memory)

I.2. Les registres

  • Un registre est un emplacement de mémoire interne à un processeur. Les registres se situent au sommet de la hiérarchie mémoire : il s'agit de la mémoire la plus rapide d'un ordinateur, mais dont le coût de fabrication est le plus élevé car la place dans un microprocesseur est limitée.
      
  • L'accès par le processeur à une information située dans la DDR SDRAM de la mémoire centrale est 100 fois plus lente qu'un accès à une information contenue dans un registre.
      
  • Les registres sont utilisés pour stocker des opérandes et des résultats intermédiaires lors des opérations effectuées dans l'UAL (Unité Arithmétique et Logique) du processeur.
      
  • La plupart des PC actuels ont des registres de tailles 64 bits.

Instruction LOAD

Noms de registres

  • Dans le premier cas, chaque registre se voit attribuer une référence, une sorte d'identifiant qui permettra de le sélectionner parmi tous les autres. C'est un peu la même chose que pour la mémoire RAM : chaque byte de la mémoire RAM se voit attribuer une adresse bien précise. Et bien pour les registres, c'est un peu la même chose : ils se voient attribuer quelque chose d'équivalent à une adresse, une sorte d'identifiant qui permettra de sélectionner un registre pour y accéder.
     
  •  Cet identifiant est ce qu'on appelle un nom de registre.
       
  • Ce nom n'est rien d'autre qu'une suite de bits attribuée à chaque registre, chaque registre se voyant attribuer une suite de bits différente. Celle-ci sera intégrée à toutes les instructions devant manipuler ce registre, afin de sélectionner celui-ci.
    Ce numéro, ou nom de registre, permet d'identifier le registre que l'on veut, mais ne sort jamais du processeur : ce nom de registre, ce numéro, ne se retrouve jamais sur le bus d'adresse. Les registres ne sont donc pas identifiés par une adresse mémoire. 

 

I.3. Mémoires centrales et mémoire cache

La mémoire centrale : RAM (Random Acces Memory)

  • La mémoire centrale est une mémoire vive qui contient les programmes en cours et les données qu'il utilise. Elle est de taille importante (plusieurs Go).
  • Elle est organisée en céllules qui contiennent chacune une donnée ou une instruction repérée par un entier : un adresse mémoire.
  • Le temps d'accès à chaque cellule est identique, on parle improprement de mémoire à accès aléatoire ou RAM (Random Acces Memory) mais on devrait plutôt parler de mémoire à accès direct.

 

La mémoire cache

  • Pour pouvoir adapter la très grande vitesse du processeur à celle bien plus faible de la RAM, on place entre les deux une mémoire très rapide, la mémoire cache.
     
  • Il existe souvent plusieurs niveaux de mémoire cache : L1, L2 ...
  • Généralement la mémoire cache de niveau L1 et celle de niveau L2 sont regroupées dans la même puce que le processeur (cache interne).

registres

 

II. Assembleur et jeu d'instructions

II.1. L'assembleur

  • Un programme écrit dans un langage de haut niveau (comme Python) éloigné du langage machine (dit de bas niveau) dépend le moins possible du processeur et du système d'exploitation.

  • Si on ouvre un fichier exécutable avec un éditeur (hexadécimal), on obtient :

01ebe814063727473747566662e6305f5f43544f525f4c
5f05f5f44544f525f4c4953545f5f05f5f4a43525f4c49
53545f5f05f5f646f5f676c6f62616c5f64746f72735f6
75780636f6d706c657465642e36353331064746f725f69

  • C’est une suite d’instructions comme 01ebe814, que l’on peut traduire directement de façon plus lisible :

add $t7, $t3 , $sp

  • C’est ce qu’on appelle l’assembleur.
    L’assembleur est donc une représentation du langage machine.

  • Il y a autant d’assembleurs que de type de processeurs différents.

II.2. Instructions et assembleur

Il y a trois types d’instructions

  1. instructions de transfert entre registres et mémoire
    • chargement
    • sauvegarde
  2. instructions de calcul
    • additions, multiplications
    • opérations logiques
    • comparaisons, sauvegarde
  3. instructions de saut
    • sauts inconditionnels
    • sauts conditionnels
    • sauvegarde
  4. appels système

 

II.3. Exemples d'assembleurs

 Il existe plusieurs logiciels premattant de programmer en assembleur, citons :

De nombreux assembleurs coexistent et les instructions diffèrent donc de l'un à l'autre mais beaucoup de fonctions sont communes.

 

II.3.1. Sur l'émulateur MARS par exemple

Exemple 1 : avec MARS (téléchargeable ici)

Ecrire ces ligne puis cliquer sur RUN / Assemble

la  $t1,3   
addi $t2,$t1,5

Cela revient à :

  • la $t1,3  : charger (la = LOAD) 3 dans le registre $t1
  • addi $t2,$t1,5 : Affecter au registre $t2 l'addition de 5 et de la valeur de $t1

Mars nous donne le conversion de ces instructions :

assembleur mars1

 

II.3.2. Sur l'émulateur  de CPU :  http://www.peterhigginson.co.uk/AQA/.

 sim cpu

Dans ce simulateur :

  • à droite, on trouve la mémoire vive ("main memory")
  • au centre, on trouve le microprocesseur (CPU)
  • à gauche on trouve la zone d'édition ("Assembly Language"), c'est dans cette zone que nous allons saisir nos programmes en assembleur.

 Le CPU

Dans la partie centrale du simulateur, nous allons trouver en allant du haut vers le bas :

  • le bloc "registre" ("Registers") : nous avons 13 registres (R0 à R12) + 1 registre (PC) qui contient l'adresse mémoire de l'instruction en court d'exécution
  • le bloc "unité de commande" ("Control Unit") qui contient l'instruction machine en cours d'exécution (au format hexadécimal)
  • le bloc "unité arithmétique et logique" ("Arithmetic and Logic Unit")

 

Exemple 2

  •  1. Dans la partie "éditeur" ("Assembly Language") saisissez les lignes de codes suivantes
MOV R0,#42
STR R0,150
HALT

Ses instructions signifient :

  • MOV R0,#42  : Place le nombre 42 dans le registre R0
  • STR R0,150   : Stocke le contenu de R0 dans la mémoire 150
  • HALT              : on arrête le processus

 

  • 2. Une fois la saisie terminée, cliquez sur le bouton "submit". Vous devriez voir apparaitre des nombres "étranges" dans les cellules mémoires 000, 001 et 002 :

assembleur peterhigginson1

L'assembleur a converti les 3 lignes de notre programme en instructions machines,

  • MOV R0,#42 : la première instruction machine -476053462 est stockée à l'adresse mémoire 000 (elle correspond à "MOV R0,#42" en assembleur),
  • STR R0,150  : la deuxième à l'adresse 001 (elle correspond à "STR R0,150" en assembleur)
  • HALT : et la troisième à l'adresse 002 (elle correspond à "HALT" en assembleur)

Pour avoir une idée des véritables instructions machines, vous devez repasser à un affichage en binaire (bouton "OPTION"->"binary"). Vous devriez obtenir ceci :

 assembleur peterhigginson2

On remarque que l'octet de droite de l'instruction machine "11100011 10100000 00000000 00101010", soit, (00101010)2, est bien égale à (42)10

 

  • 3. Simulation
    Pour exécuter notre programme, il suffit maintenant de cliquer sur le bouton "RUN".
    Vous allez voir le CPU "travailler" en direct grâce à de petites animations.
    Si cela va trop vite (ou trop doucement), vous pouvez régler la vitesse de simulation à l'aide des boutons "<<" et ">>".
    Un appui sur le bouton "STOP" met en pause la simulation, si vous rappuyez une deuxième fois sur ce même bouton "STOP", la simulation reprend là où elle s'était arrêtée.

Une fois la simulation terminée, vous pouvez constater que la cellule mémoire d'adresse 150, contient bien le nombre 42 (en base 10). Vous pouvez aussi constater que le registre R0 a bien stocké le nombre 42.

 assembleur peterhigginson3

Exemple 3

Effectuer les instructions suivantes et commentez-les :

MOV R0,#10
MOV R1,#20
ADD R2,R1,R0
ADD R2,R2,#5

 

Remarque : L'instruction pour effectuer une addition est : ADD R2,R0,R1 (place dans R2 le résultat de R0+R1)

 

 

II.3. Exercices

Pour faire d'autres exercices 

 

Compléments

 

Articles Connexes