Exécuter une séquence d'instructions
- Fiche de cours
- Quiz
- Profs en ligne
- Videos
- Application mobile
Comprendre des instructions du langage machine, le seul langage compréhensible par le processeur.
- Un programme est stocké dans la mémoire d’un ordinateur sous la forme d’une suite d’instructions, on appelle cela le langage machine.
- Le langage machine est cependant difficile à utiliser. On passe donc par un assembleur qui va représenter le langage machine par un langage compréhensible par les humains.
- Architecture d’un ordinateur
- Notions de registres et de mémoires
Ces instructions, réalisées au rythme de l’horloge du processeur, se font en trois temps.
-
L’instruction est chargée.
Le CPU (processeur) récupère l’instruction à l’adresse indiquée par le registre IP, puis stocke cela sur le registre IR. -
Le CPU utilise les données du registre
IR.
C’est à ce moment que les données dont le CPU a besoin sont chargées dans d’autres registres ou dans la RAM. -
L’instruction est
exécutée.
Cela implique une mise à jour de la valeur dans le registre IP pour continuer le programme.
Elle est composée de deux parties :
- le champ code opération (« opcode » en abrégé) qui indique au CPU l’opération à effectuer ;
- le champ opérande qui peut
être :
- une valeur immédiate ;
- un registre de la CPU ;
- une donnée à aller chercher dans la RAM.
Pour simplifier, les instructions machines sont de trois types :
- les instructions arithmétiques (addition, soustraction, multiplication, etc.) sur des entiers ou des flottants ;
- les instructions de transferts pour permettre l’acheminement d’une donnée d’un registre du CPU vers la RAM et vice-versa ;
- les instructions de sauts pour permettre de réaliser d’autres opérations.
Ces différentes instructions sont codées en binaire ou en hexadécimal.
Voici une portion d’une instruction machine en hexadécimal.
Le langage machine est très difficile à manipuler, on utilise donc un langage assembleur : ce langage représente le langage machine sous une forme lisible par un humain.
On va utiliser le langage assembleur x86 d’Intel car c’est le langage assembleur le plus documenté.
Un programme en langage assembleur est constitué de trois parties, appelées sections.
adresse typage valeur
Pour le typage (la nature des valeurs), on utilise : db pour un octet (8 bits), dw pour 2 octets (16 bits) et dd pour 4 octets (32 bits).
section .data | La section .data du programme en assembleur |
alpha db 3 | initialise à l’adresse mémoire nommée alpha un mot d’un octet contenant 3. (« db » pour define byte) |
section .bss | La section .bss du programme en assembleur |
a resb 3 | permet de réserver 3 mots de 1 octet à l’adresse a (pour la variable a) |
b db 6 | et permet de réserver un mot d’un octet à l’adresse b (variable b) initialisée à 6. |
Pour utiliser la variable contenue dans la mémoire d’adresse a, on devra taper [a].
Le langage assembleur x86 d’Intel possède 8 registres, qui sont A, B, C, D, E, F, G et H pour simplifier.
Voici quelques instructions associées à ce langage afin de mieux le comprendre.
nom_opération destination, source
Les opérations valides sont add pour additionner, sub pour soustraire, puis and et or pour les opérations logiques.
- add B,1 va permettre d’ajouter la valeur 1 à la valeur B.
- sub A,2 va permettre de soustraire le nombre 2 à la valeur A.
cmp v1, v2.
Cette instruction compare la différence v1 - v2 à 0 et indique le résultat en levant (stockant 1 à l’intérieur) un drapeau, c’est-à-dire en stockant 1 :
- dans un registre nommé zf s’il y a égalité ;
- dans un registre nommé sf s’il n’y a pas égalité.
Ces drapeaux (registres zf et sf) permettent de diriger le saut vers une autre ligne ou vers une boucle du programme.
Cette instruction de saut permet de faire un saut à l’adresse indiquée si le drapeau zf vaut 1, donc s’il y a égalité entre les valeurs testées.
Cette instruction de saut permet de faire un saut à l’adresse indiquée si le drapeau sf vaut 1, donc s’il y n’y a pas égalité entre les valeurs testées.
Il existe aussi :
- l’instruction jg (pour jump greater) pour indiquer un saut si v1 > v2 ;
- l’instruction jl (pour jump lower) pour indiquer un saut si v2 > v1 ;
- et enfin l’instruction jmp (pour jump) pour indiquer un saut sans aucune condition.
La commande mov destination, source permet ainsi de copier le contenu de la source dans la destination.
Langage assembleur | Explication |
mov A, 10 | Copie 10 dans le registre A |
mov B, 5 | Copie 5 dans le registre B |
bcl: | On entre dans une boucle nommée bcl. |
cmp A, B | Comparaison des registres A et B |
je fin | Si A=B, on saute vers la boucle fin. |
add B, 1 |
Ajout
de 1
dans le
registre B Le registre B contient 5 et on ajoute 1, B contient donc la valeur 6. |
fin : | On entre dans une boucle nommée fin. |
mov C, 8 | Copie 8 dans le registre C |
Vous avez obtenu75%de bonnes réponses !