Cours générale pour débuter avec Assembleur 68000
Assembleur 68000
Je tiens à remercier chaleureusement MonsieurPhilippe Meyne, enseignant à
l'IUT GEII d'Evry pour sa participation importante à l'élaboration de ce cours.
P. Hoppenot (1999)
Toute action informatique peut être décrite par une séquence d'instructions permettant :
• Transfert : allocation en mémoire et dans les registres internes du processeur.
Allocation : écrire / lire
? 2 Écrire le nombre 2 dans l'emplacement mémoire réserve ?.
• Opérations arithmétiques et logiques (fait en première année).
Addition, multiplication, inversion de signe…
ET, OU, NON, XOR, NAND, NOR…
• Branchement conditionnels : si <condition> alors aller à inconditionnels : aller à
• Appel à sous programme
L'objectif du chapitre est d'étudier quelques instructions de ces différents types.
Assembleur = langage donc règles et syntaxes.
Étiquette |_| Mnémonique.format |_| source, destination |_| commentaires
Étiquette : | Facultative, permet de repérer une instruction dans un programme. |
Mnémonique : | Nom de l'instruction |
Format : | Taille des données manipulées. .B byte octet .W word mot .L long word mot long |
Source : Donnée de départLa source et la destination peuvent être Destination : Endroit d'arrivéeconfondues
Exemple :
DEB |_| MOVE.B |_| D0,D1 | Transfert l'octet de poids faible du registre D0 dans le registre D1. |
|_| NOT.B |_| D1 | Complément à 1 de l'octet de poids faible de D1. Remarque : La source et la destination sont confondues. |
|_| BRA |_| DEB | Saute à l'étiquette DEB |
Instruction de transfert : MOVE.
Syntaxe : MOVE.<format> |_| <source>, <destination>
La donnée est contenue dans un registre.
MOVE.L "valeur", D0 destination (D0) en adressage direct Le registre D0 est initialisé avec la "valeur".
MOVE.B "valeur", D0 seul l'octet de poids faible de D0 est modifié.
Si valeur = AF :
D0 avant FA23FBED par exemple
D0 après FA23FBAF
La donnée est contenue dans l'instruction.
MOVE.W #523,D0 le mot de poids faible de D0 est initialisé avec 523.
immédiat direct
Dans l'exemple, quelle est la base de 532 ? Par défaut base 10.
Notations : # $ hexadécimal donnée % binaire
& décimal
Piège : MOVE.B #$D0, D0 transfert de la donnée $D0=208 (décimal) dans le registre D0.
L'adresse est contenue dans l'instruction.
MOVE.B #$F0, $FF9001 Écrit la donnée F0 à l'adresse FF9001.
1D |
2A |
FF9003 Pour un mot, l'adresse doit être
paire : MOVE.W #$2A1D, $FF9002FF9002
.L
L'adresse de la source ou de la destination est contenue dans un pointeur d'adresses. MOVE.B D0, (A3)
La source est le La destination est l'adresse pointée contenu du registre le pointeur A3 (adresse effective).
$FF | $12 |
D0 B21E4112
$FF9100
A3 00FF9100
avant après
Le contenu du pointeur d'adresses est l'adresse effective de la donnée transférée.
L'adresse effective est la somme du contenu du pointeur d'adresses et d'un déplacement fixe.
MOVE.W #$F14D, $70(A4). A4 00FF9100 | ||
Adresse effective : | FF9100 | (A4) |
+ 70 FF9170 | 70 |
L'adresse effective est la somme du contenu du pointeur d'adresses, d'un registre d'index et d'un déplacement fixe.
déplacement Registre d'index .L ou .W, pas .B
MOVE.L D7, $70(A2, D1.L)
Pointeur
Adresse effective 00FF6000 A2
00001A0C D1.L
00000070 déplacement
00FF9A7C l'adresse est bien paire
Déplacement : 8 bits si indexé + déplacement
16 bits si déplacement seul
II.7.Adressage indirect post incrémenté
L'adresse effective de la source ou de la destination est contenue dans un pointeur d'adresses.
Le pointeur est incrémenté à la fin de l'instruction.
NOT.B (A3)+ | A3 = FF9600 avant l'instruction = AE. A3 = FF9601 après l'instruction. |
Incrémentation : | 1 octet 2 mot 4 mot long |
NOT.L (A3)+ | A3 = FF9600 avant l'instruction = AE. A3 = FF9604 après l'instruction. |
Sert à la gestion des piles.
L'adresse effective de la source ou de la destination est contenue dans un pointeur d'adresses. Le pointeur est décrémenté au début de l'instruction.
Sert à la gestion des piles.
Adresse effective sur 24 bits (A23…A0).
Pb : Si l'adresse n'est pas sur 24 bits, elle est complétée en extension de signe.
NOT.L $F000 AE : FFF000 NOT.L $7000 AE : 007000
Piège : (An, Dm)
contenu en .w, extension de signe
NOT.W (A3, D2) A3 = FF9300 D2 = FF0700
AE : FF9300
000700
FF9A00
Deux manières d'effectuer un branchement inconditionnel :
Inconditionnel JMP, BRA
Conditionnel Bcc, (DBcc)
aller à étiquette
Séquence de code non exécuté
étiquette
Instructions :
BRA étiquette Déroutement relatif.
PC PC + étiquette
Déplacement : nombre d'instructions entre l'endroit du branchement et l'endroit où le programme doit se brancher.
JMP étiquette Déroutement absolu.
PC étiquette
Adresse de branchement.
JMP génère un code non relogeable => déconseillé.
Intérêt : Dérouter un programme en fonction d'une condition.
Structure : si <condition> alors <traitement>.
Contient les informations qui vont permettre le test.
Poids faible du registre d'état : SR (Status Register).
Regsitre système | Registre code condition
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ||||
T | S | I2 | I1 | I0 | X | N | Z | V | C | |||||||||
Mode trace Masque d'interruption | Extension Retenue | |||||||||||||||||
Etat supervieur Les bits du regsitre code condition sont positionnés par : | Dépassement Zéro Négatif | |||||||||||||||||
les instructions arithmétiques et logiques, certaines instructions de transfert (calcul d'adresse),Lecture de la doc :
l'instruction de comparaison : CMP,MOVE, ADD… l'instruction de test de bit : BTST.
Exemple :
MOVE.B #$1, D0 * D0 1
SUB.B #$1, D0 * D0 D0-1
+ Z = 1
+ C = 0
SUB.B #$1, D0 * D0 D0-1
+ Z = 0
+ C = 1 + N = 1
Reste à tester ces bits pour effectuer ou non un branchement.
Bcc cc = EQ (EQual)
NE (Not Equal)
… (voir §.2.4)
Elle permet de comparer 2 données. Elle positionne les bits du registre code condition.
Syntaxe : CMP.<format> <source>, <destination>
<destination> - <source>, mais ne modifie pas la destination.
Exemple :
MOVE.B #$0A, D0
MOVE.B #$0B, D1
CMP.B D1, D0
D0 - D1 < 0
+ N = 1
+ Z = 0
+ V = 0
+ C = 1 CMP.B #$0A, D0
D0 - #$0A = 0 + N = 0
+ Z = 1
+ V = 0
+ C = 0
CMP.B D0, D1
D1 - D0 > 0
+ N = 0
+ Z = 0
+ V = 0
+ C = 0
Elle permet de tester un bit d'un regsitre. Elle postionne l'indicateur Z.
Syntaxe : BTST <n°de bit>, AE (Adresse Effective)
Si le bit est à 0 alors Z = 1.
Elles permettent d'effectuer un branchement en fonction du registre de conditions.
Syntaxe : Bcc etiquette (cc : code condition)
Remarque : il s'agit d'un branchement relatif.
Les différentes conditions :
CC retenue à 0 | C |
CS retenue à 1 | C |
EQ égal | Z |
NE non égal | Z |
GE supérieur ou égal N.V + N.V Arithmétique
GT supérieur N.V.Z + N.V.Z signée
HI plus grand C.Z Arithmétique non signée
LE inférieur ou égal Z+ N.V + N.V Arithmétique
LT inférieur N.V + N.V signée
LS plus petit ou égal C+ Z Arithmétique non signée MI négatif N PL positif N VC pas de dépassement V VS dépassement V | |
( | Pour la soustraction, le bit C (carry) est le complément de celui trouvé dans la |
soustraction avec la convention signée. Ce choix est cohérent avec la retenue utilisée pendant l'opération de soustraction.
Exemple 1 :
MOVE.B | #$0A,D0 | X | |
MOVE.B | #$0B,D1 | Y | |
CMP.B | D0,D1 | Y-X = #$1 N=0, Z=0, V=0, C=0 BGT vrai Y>X BLE faux Y ? X BHI vrai Y>X BLS faux Y ? X | |
CMP.B | D1,D0 | Y-X = #$FF N=0, Z=0, V=0, C=0 BGT faux Y>X BLE vrai Y ? X BHI faux Y>X | |
BLS vrai Y ? X | ) |
Elles permettent d'effectuer un branchement en fonction du registre de conditions en intégrant un comptage..
Syntaxe : | DBcc Dn,etiquette | (cc : code condition) |
Si (condition fausse) | alors Dn Dn-1 | |
Si (Dn ??1) | alors PC PC + d (deplacement étiquette) sinon PC PC + 2 |
Exemple : Boucle de temporisation
tempo MOVE.W #$FFFF,D0
bou DBEQ D0,bou …
bou Si (Z ? 0) alors D0 D0-1
Si (Dn ??1) alors bou
Suite du programme
Principe :
Branche au sous programme
Une fois le sous programme terminé, le programme revient juste après l'instruction d'appel.
retour
Instruction précieuse :Conception modulaire.
Séquence de code répétitive.
Instructions :
BSR étiquette Branchement relatif.
PC retour sauvegardé
PC PC + étiquette
Déplacement : nombre d'instructions entre l'endroit du branchement et l'endroit où le programme doit se brancher.
JSR étiquette Branchement absolu.
PC retour sauvegardé
PC étiquette
Adresse de branchement.
JSR génère un code non relogeable => déconseillé.
Instruction de retour :RTS.