1- Introduction

Le langage assembleur, ou langage machine, est un ensemble d'instructions qui permettent de traiter l'information de base d'un microprocesseur.

Un microprocesseur traite les informations en utilisant un programme qui se trouve en mémoire RAM : il exécute les instructions les unes après les autres.

Pour mémoire, l'information de base est un ensemble de 0 et 1 organisés en octet (code ascii par exemple) ou multiple d'octets (représentation d'un nombre décimal avec la norme IEEE).

Chaque microprocesseur à son propre jeu d'instructions qui permettent de globalement de :

- lire/écrire en mémoire RAM (pour mémoire la RAM n'est pas dans le microprocesseur, mais à côté)

- lire/écrire dans les registres (pour mémoire les registres sont dans le microprocesseur et permettent de mémoriser à très court terme des informations)

- faire des calculs plus ou moins poussé selon le jeu d'instructions du microprocesseur,

- faire des tests logiques (égalité, plus grand ou plus petit...),

- faire une rupture de séquence (par exemple, en fonction d'un test, d'indiquer au microprocesseur où se trouve la prochaine instruction à exécuter).

L'objectif de cette activité n'est pas de vous apprendre à programmer en assembleur, mais de comprendre comment fonctionne un programme assembleur.

 

2- Utilisation de l'interface d'un simulateur de micro-processeur selon l'architecture de Von Neumann

Ce simulateur a été réalisé par Peter L Higginson, dont voici une capture d'écran :
presentation simu assembleur
 
La zone verte à gauche permet d'écrire les instructions d'un petit programme en langage assembleur.
La zone bleue à droite correspond à la mémoire RAM.
Au centre, c'est la représentation schématique du microprocesseur.

L'utilisation est simple :

- Saisir les instructions, puis cliquer sur le bouton Submit.
- Lancer pas à pas, avec le bouton STEP, le programme afin de visualiser les échanges d'informations entre les différentes parties du simulateur. La vitesse peut être modifiée.
- Lancer le programma en entier avec le bouton RUN.
Pour relancer le programme, il faut d'abord cliquer sur RESET.
 
Compteur d'instruction :

Le registre PC, le compteur d'instructions, indique l'adresse de la prochaine instruction à exécuter.

Sur la capture d'écran, la première instruction qui correspond à MOV R0,#42 est située à l'adresse 0 (surlignée en rose).

Quelle est la valeur décimale de 28 ?
Combien d'octets faut-il pour stocker xe3a01028 ?
Quel type de codage est utilisé pour coder xe3a01028 ?
En déduire le nombre de bits de cette architecture pour le codage des instructions ?
hexadécimal
binaire
ascii

3- Quelques instructions de base 

a- Écrire un nombre dans un registre et stocker cette valeur en RAM

Recopier le code ci-dessous afin de lancer la simulation.

MOV R1,#40
STR R1,35

HALT

Le # permet d'indiquer au micro-processeur que c'est
Une fois le programme exécuté, quel nombre se trouve en RAM à l'adresse 35 ?
une valeur
une adresse
un commentaire

Les instructions sont issues de l'anglais : MOV pour move et STR pour store.

Ce programme est l'équivalent python de varA=40.

C'est le système d'exploitation qui choisirait alors à quelle adresse stocker cette variable.

Il existe aussi l'instruction LDR (pour load) dont un exemple est donné ci-dessous.

b- Additionner une valeur de la RAM avec un nombre et stocker le résultat en RAM

Pour faciliter la suite du travail, vous sélectionner dans les options signed.

Recopier le code ci-dessous dans la zone de code.

LDR R3,25
ADD R1,R3,#15
STR R1,27
HALT

Cliquer dans la RAM à l'adresse 25 pour y écrire le chiffre -13 et lancer la simulation.

Indiquer l'état des registres et de la RAM une fois le programme exécuté.
LDR R3, 25
STR R1, 27
ADD R1, R3, #15
-13
HALT

 Ce programme est l'équivalent python de :

varC = varA + 15, sachant que varA est déjà en mémoire à l'adresse 25.

Plusieurs variantes d'opérations sont possibles :

ADD R1,R2,R3 ⇾ signifie R1=R2+R3

SUB R1,R3,#15 ⇾ signifie R1=15-R3

SUB R1,R2,R3 ⇾ signifie R1=R3-R2

c- Comparer deux valeurs et indiquer où continuer le déroulement du programme

Voici 3 nouvelles instructions :

- CMP R0,R1compare R0,R1 : comparer les valeurs des registres R0 et R1

- BEQ truebranch equal : si les deux valeurs comparées sont égales, aller à l'étiquette true.

- B sauvbranch sauv : aller à l'étiquette sauv.

À noter qu'une étiquette est en réalité une adresse mémoire indiquant la prochaine instruction à exécuter.

Afin de savoir comment elles s'utilisent, faites l'exercice suivant.

Compléter l'algorigramme qui est l'équivalent du programme assembleur.

Compléter l'état des registres et de la RAM une fois le programme fini.

BEQ true
B sauv
MOV R2,#99
CMP R0, R1
STR R2,20
MOV R2,#111
MOV R0,#12
MOV R1,#10

Plusieurs variantes de comparaison sont possibles :

CMP R0,R1 suivi de :

BNE étiquette ⇾ branch not equal

BGT étiquette ⇾ branch greater : R0 > R1

BLT étiquette ⇾ branch lowest : R0 < R1

4- Écrire un programme simple

Vous allez reproduire l'algorigramme suivant avec le simulateur.

exoBranchAlgo1

 

Je vous conseille de regarder le cours en ressource de David Roche pour vous aider.

La variable x est à stocker à l'adresse 20 et c'est le registre R1 qui l'utilise.

La variable y est à stocker à l'adresse 21 et c'est le registre R2 qui l'utilise.

Coller le code de votre programme assembleur et indiquer l'état des registres et de la mémoire une fois le programme fini.

Ne valider qu'une fois toutes les données saisies : je corrigerai votre proposition.

Code assembleur