III - PROGRAMMATION EN ASSEMBLEUR

Transcription

III - PROGRAMMATION EN ASSEMBLEUR
III - PROGRAMMATION EN ASSEMBLEUR
3.1 Introduction à la programmation en assembleur
Pour programmer un ordinateur on utilise généralement des langages dits évolués ou de haut
niveau : C, C++, Java, Basic, Fortran, Pascal, Ada, Assembleur, etc. Cependant l'unité
centrale ne peut exploiter que les instructions machine: Les codes binaires qui sont chargés
dans le registre instruction.
Le terme de langage désigne un jeu d'instructions et de règles syntaxiques. A l'aide d'un
langage évolué le programmeur écrit un code source. Celui-ci n'est pas directement
exécutable par l'ordinateur. Il faut le traduire en code machine ou code objet. C'est le rôle des
compilateurs ou assembleurs et des interpréteurs. Un interpréteur ne produit pas de code objet
il traduit les instructions directement au fur et à mesure de l'exécution du programme.
La figure suivante schématise les différents niveaux de programmation. Lorsque l'utilisateur
peut accéder au niveau de la microprogrammation la machine est dite microprogrammable.
Exemple : l’opération simple
réalisée par un microprocesseur (bus données 8 bits et bus adresses 16 bits)
28+56=84
Charger la valeur 28 dans
l’accumulateur
Additionner la valeur 56 au
contenu de l’accumulateur, le
résultat reste dans l’accumulateur
Ranger la somme, contenue dans
l’accumulateur, dans la cellule
mémoire d’adresse M
TRADUCTION EN LANGAGE
« TÉLÉGRAPHIQUE »
1.
2.
3.
CHARGEMENT
ACCUMULATEUR,2810
ADDITION
ACCUMULATEUR, 5610
RANGEMENT MÉMOIRE M, ACCUMULATEUR
Réduction
1.
LOAD
A, 2810
2.
ADD
A, 5610
3.
STO
M, A
Mnémonique facile à
retenir
Si on donne l’adresse en mémoire M=2050
1.
LOAD
A, 2810
2.
ADD
A, 5610
3.
STO
205010, A
Incompréhensible par le microprocesseur.
Donc traduire cela en binaire
Le fabricant donne la liste des instructions
mnémoniques et le code binaire correspondant.
Mnémonique
ANA M
Opération
Faire une opération logique AND
entre le contenu de l’adresse
mémoire M et le contenu de
l’accumulateur A
Code binaire
10100110
Nbre de
microcycles
7
Si l’horloge = 2 Mhz cette instruction demande t=0.5x10-6x7=3.5 micro-secondes
Supposons les codes des opérations
0011 1110
pour
LOAD A
1100 0110
pour
ADD A
0111 0111
pour
STO M,A
Transformons les données et adresses en binaire :
0001 1100
2810
0011 1000
5610
et l’adresse
0000 1000 0000 0010
205010
Le programme complet devient :
Numéro d’ordre de
l’instruction
Instruction
1
Code opération
0011 1110
Opérande ou adresse
0001 1100
2
1100 0110
0011 1000
3
0111 0111
0000 1000 0000 0010
En hexadécimal
Numéro d’ordre de
l’instruction
Instruction
1
Code opération
3E
Opérande ou adresse
1C
2
C6
38
3
77
0802
Le traducteur du code mnémonique au code numérique s’appelle l’assembleur
Le retour du numérique vers le mnémonique s’appelle le désassemblage
3.2 Structures des instructions au niveau machine
Format des instructions
Les ordinateurs sont capables d'effectuer un certain nombre d'opérations élémentaires.
Une instruction au niveau machine doit fournir à l'unité centrale toutes les informations
nécessaires pour déclencher une telle opération élémentaire : type d'action, où trouver le ou
les opérandes, où ranger le résultat, etc. C'est pourquoi une instruction comporte en général
plusieurs champs ou groupes de bits. Le premier champ contient le code opération. Les autres
champs peuvent comporter des données ou l'identification des opérandes. La figure 10 donne
quelques exemples d'instructions à n adresses, pour n = 0, 1 et 2. Sur certaines machines les
instructions sont toutes de même longueur, sur d'autres cette longueur peut varier avec le code
opération ou le mode d'adressage.
On distingue six groupes d'instructions :
• transferts de données : de mémoire à registre, de registre à registre, de registre à mémoire;
• opérations arithmétiques : addition, soustraction, multiplication et division;
• opérations logiques : ET, OU inclusif, NON, OU exclusif, etc.;
• contrôle de séquence : branchements conditionnels ou non, appel de procédure, etc.;
• entrées/sorties;
• manipulations diverses : décalage, conversion de format, permutation circulaire des bits,
échange d'octets, incrémentation, etc.
Le choix de la longueur et du format des instructions est une étape très importante dans la
conception d'une nouvelle architecture. C'est encore une affaire de compromis. La longueur
des instructions se répercute sur la dimension de la mémoire centrale donc sur le coût : il faut
deux fois plus de bits pour stocker un programme de n instructions de 32 bits qu'un
programme de n instructions de 16 bits.
Exemple: M68HC12
Une instruction
Label (étiquette)
Exemple:
Opcode
LDX
4 champs
Champs du code source
Opérande
$F682
Commentaire
; Faire appel à getchar
a- champ label ou étiquette ( n caractères )
b- champ opération (code d'instruction)
c- champ opérande (soit l'opérande ou son adresse)
d- champ commentaires (commence par ; )
3.3 Exemple de machine microprogrammée
Soit la machine suivante, qu'on appellera MP3531
Architecture de la machine MP3531
Description :
– Tous les nombres/adresses sont en décimal (pas hexa),
– Un “octet” (byte) est constitué de 2 chiffres décimaux,
– Une adresse, ou mot, est constituée de 2 octets (4 chiffres décimaux), ainsi les adresses vont
de 00 00 à 99 99.
– Un bit est soit vrai soit faux.
– La mémoire est adressable par octets (chaque unité de mémoire contient un octet).
Description des composantes du MP3531
PC (mot) : Compteur de programme (Program Counter), registre d’un mot mémoire contenant
l’adresse de la prochaine instruction à exécuter.
opCode (octet) : registre d’instruction (parfois dénoté par IR), contient l’OPCODE de
l’instruction en cours.
opAddr (mot) : L’opérande de l’instruction en cours d’exécution. L’opérande test une
toujours une adresse. Certaines instructions nécessitent la valeur contenue à l’adresse indiquée
; cette valeur n’est pas transférée par le cycle de transfert de base, mais doit être transférée par
l’opération elle même lors de l’exécution (voir étape 3 du cycle de transfert ainsi que la
description de chacune des instructions ci-bas).
MDR (octet) : registre donnée mémoire (Memory Data Register). Une donnée transférée
(read/loaded) de la mémoire vers le processeur est toujours placée dans le registre de donnée.
De même, une donnée transférée du processeur vers la mémoire (stored) doit être placée dans
le registre de donnée.
MAR (mot) : registre adresse mémoire (Memory Address Register). Ce registre contient
l’adresse mémoire à partir de laquelle une donnée doit être lue ou vers laquelle elle doit être
écrite.
A (octet) : Accumulateur. Toutes les opérations arithmétiques utilisent ce registre comme
opérande et aussi pour sauver leur résultat.
H (bit) : le bit de statut “Halt”. Ce bit est mis-à -jour par l’instruction
“halt” (hlt). Si ce bit est vrai, le processeur s’arrête lorsque l’opération courante est terminée.
N (bit) : le bit de statut “Négative”. Les opérations arithmétiques affectent la valeur vraie à ce
bit lorsqu’elles produisent un résultat négatif. Certaines opérations n’affectent pas la valeur de
ce bit, ainsi sa valeur ne reflète pas toujours l’état courant de l’accumulateur.
Z (bit) : le bit de statut “Zéro”. Les opérations arithmétiques affectent la valeur vraie à ce bit
lorsqu’elles produisent le résultat zéro. Certaines opérations n’affectent pas la valeur de ce bit,
ainsi sa valeur ne reflète pas toujours l’état courant de l’accumulateur.
RW (bit) : le bit de statut “READ/WRITE”. Si sa valeur est vraie, signifie qu’une donnée sera
lue (fetched) de la mémoire et transférée dans le registre MDR de l’unité centrale. Si faux,
signifie qu’une donnée sera transférée du registre MDR vers la mémoire.
Jeu d'instruction du MP3531
Instructions sans opérande
(08) CLA : “clear accumulator”, met à zéro le registre accumulateur,
(10) INC : “increment”, ajoute 1 au contenu de l’accumulateur,
(64) HLT : “halt”, met le bit de statut H à vrai.
Instructions ayant un opérande
(91) LDA x : “load”, copie dans l’accumulateur la valeur contenue à l’adresse x de la
mémoire,
(39) STA x : “store”, copie le contenu de l’accumulateur à l’adresse x de la mémoire,
(99) ADD x : copie la valeur se trouvant à l’adresse x et l’additionne au contenu de
l’accumulateur,
(61) SUB x : copie la valeur se trouvant à l’adresse x et soustrait cette valeur du contenu de
l’accumulateur,
(01) DSP x : “display”, copie le contenu de l’adresse x et affiche à l’écran. Cette instruction
n’est pas représentative de la réalité, les opérations d’entrée/sortie son très complexes.
(15) JMP x : “jump to” (“goto”), branchement inconditionnel (absolue), la prochaine
instruction exécutée est celle à l’adresse x.
(17) JZ x : branchement vers x seulement si le bit de statut Z est vrai.
(19) JN x : branchement vers x seulement si le bit de statut N est vrai.
Exemple
Afin d’ajouter 1 à la valeur x et de sauver le résultat dans y (y = x +1).
– Charger la valeur de x dans l’accumulateur, registre A.
– Incrémenter la valeur de l’accumulateur,
– Sauver la valeur qui se trouve dans l’accumulateur à l’adresse y.
Ceci implique 3 instructions machines :
91 : load
10 : incrémente
39 : store
Si x désigne l’adresse 27 96 et y désigne l’adresse 91 27, alors y = x + 1
peut s’écrire en langage machine comme suit :
[91 27 96] [10] [39 91 27]
(en réalité 91 27 96 10 39 91 27)
Exercice
Que fait la partie du programme suivante ? en sachant que le jeu d'instruction du
microprocesseur est celui du MP3531, donner le programme source en assembleur.
Code objet: 08 39 00 44 91 00 42 61 00 43 19 00 29 39 00 46 91 00 44 10
Code source:?

Documents pareils