1 Langage machine
1.1 Définition
C'est le seul langage qui soit directement compréhensible par un microprocesseur. Il est composé d'une
suite d'octets localisés en mémoire et dont le contenu, binaire, constitue une suite de codes significatifs pour
le microprocesseur.
Il est nécessaire de bien comprendre que quel que soit le langage utilisé en programmation évoluée ( C ,
ADA, Programmation Structurée, Programmation Objets) , les outils de programmation finiront toujours
par fournir à notre microprocesseur des codes langage machine...
1.2 Exemple
Prenant l'instruction suivante comme exemple : MOVE.L $FC0024, $2400
Cette instruction est en langage assembleur, son équivalent binaire (hexadécimal) est :
$ 21F9 00FC 0024 2400
C'est ce code là qui est stocké en mémoire et qui sera exécuté par le µp. donc le code opération de
l'instruction MOVE.L est $ 21F9 == % 00 10 000 111 111 001.
00 = MOVE
10 = .L
000 111 = L'opérande Destination est une adresse mémoire sur 16 bits...
111 001 = L'opérande Source est une adresse mémoire sur 32 bits...
2 Langage assembleur :
2.1 Définition
Un programme en langage d'assembleur est stocké sous forme de texte (comme un programme dans un
langage de plus haut niveau). Chaque instruction assembleur représente exactement une instruction
machine. Par exemple, l'instruction d'addition décrite ci-dessus serait représentée en langage assembleur
comme suit :
ADD.B D1, $2200
Ici, la signification de l'instruction est beaucoup plus claire qu'en code machine. Le mot ADD est un
mnémonique pour l'instruction d'addition. La forme générale d'une instruction assembleur est :
Ses avantages :
- minimise le code
- meilleur contrôle sur le matériel.
[bien adapté à l’écriture des routines d’entrées/sorties]
1
2.2 Instruction de mouvement :
MOVE.(BWL) source, destination
MOVEA.(WL) src, An si sur 16 extension sur 32 bits
MOVEQ #data, Dn extension signé B L
2
[[A0]]L [A1]L
X N Z V C
Avant exécution x x x x x
Après exécution de :
x 0 1 0 0
MOVE.B $2800, $2820
Après :
x 1 0 0 0
MOVE.L $2900, D4
x 1 0 0 0
Exp.1 :
a+b
Calcul de la moyenne de 2 nombres de 32 bits : m = .
2
On suppose que aL+bL ne dépasse pas 32 bits (a+b)L et m
codés sur 32 bits.
ada = $2800; adb = $2804; adm = $2808
ORG $2400
Remarque : quand il s'agit d'une division ou
MOVE.L ada, D0 multiplication par des puissances de 2; on décale
ADD.L adb, D0 vers la droite ou la gauche respectivement.
ASR.L #1, D0
MOVE.L D0, adm
MOVE.B #9, D0
TRAP #15
3
• ADDI(B W L) #data, dest
• ADDQ(B W L) #data, dest il faudrait que data soit entre 1 et 8
• ADDX(B W L) Dn, Dm
• ADDX(B W L) -(An), -(Am)
Même chose pour la soustraction SUB
Code BCD
• ABCD -(An), -(Am)
• ABCD Dn, Dm
• SBCD -(An), -(Am)
• SBCD Dn, Dm
Remarque : quand l'addition est de plus de 8 bits, on procède par tranche voir documentation.
• MULU source, Dn | source (W) U : unsigned ; S : signed
• MULUS source, Dn | et Dn (W) résultat Dn (L) (16 x 16 32)
• DIVU source, Dn |
• DIVS source, Dn |Dn(L) ÷ source (W) résultat Dn (rW ; qW)
Exp :
MULS D3, D5
xxxx ------- D3
xxxx ------- D5
Résultat
------ -------
D5
Attention : lors de la division, on peut faire :
Dn(L) ÷ source = Q(L) erreur car Q tient sur 16 bits lors d'une opération similaire, voir
l'indicateur "V" dans le CCR le signe du reste est celui du dividende (dest) (quand il s'agit de division
signée).
4
Addition de 2 nombres a et b de 64 bits.
s = a+b sur 64 bits. On suppose que (a+b) tient sur 64 bits.
ORG $2500
MOVE.L adb+4, D0 blowD0
ADD.L ada+4, D0 blow+alowD0 (si retenue X)
MOVE.L D0, ads+4 blow+alowslowads+4
suite
MOVE.L adb, D0 bhighD0
MOVE.L ada, D1 ahighD1
ADDX.L D0, D1
addition avec retenue ne se fait qu'entre les registres sauf selon un certain mode d'adressage :
bhigh+ahigh+ XD1 (à cette étape "X=0". Car le résultat final est sur 64 bits)
MOVE.L D1, ads D1 shigh
MOVE.B #9,D0
TRAPE #15
Exp.3 :
ab + 3
Calcul de p = où a, b et c sont des nombres entiers signés sur 8 bits. Les adresses sont : ada,
c
adb, adc et adp (p partie entière).
Théoriquement :
a x b 16 bits
ab+3 17bits
ab + 3
p= 17bits – 8 bis = 9 bits p à prévoir sur 16 bits.
c
Programmation :
ORG $2600
MOVE.B ada, D0
MOVE.B adb, D1
EXT.W D0
EXT.W D1
MULS D1, D0
La multiplication n'est possible que sur 16 bits, alors, il y a nécessité d'extension de 8 bits
vers 16 bits.
5
(ab) est grâce à l'instruction précédente sur 32 bits ce qui nous arrrange; sinon , on aurait dû faire
une extension car (ab) doit être sur 32 bits pour la division.
ADDQ.L #3, D0
MOVE.B adc, D2 cB D2
EXT.W D2 cB cW (extension format 16 bits)
DIVS D2, D0 (ab+3)L / cW qW et rW D0
rW (reste) qW (quotion)
MOVE.W D0, adp
MOVE.B #9,D0
TRAP #15
Equivalences !!
END
6.1 Définition :
Une directive est une pseudo-instruction destinée à l'assembleur, c'est un ordre spécial que le
programmeur donne à l'assembleur pour affecter de valeurs à des symboles (adr EQU $2801), introduire
des données en mémoire, … etc.
6
Exp :
ORG $2400
MOVEQ #$43, D3
MOVE.L #’4ELT’, $2800
MOVE.B #9, D0
TRAP #15
END
Où d'une autre manière
val1 EQU $43
val2 EQU ‘4ELT’
adr EQU $2800
ORG $2400
MOVEQ #val1, D3
MOVE.L #val2, adr
MOVE.B #9, D0
TRAP #15
END
7
7 Comparaison et branchement :
Exp. 1 :
99
∑n i
Calcul de la moyenne de 100 nombres signés codés sur 8 bits : m = i =0
; ni nombre signé.
100
Les ni sont rangés dans une table de 100 cases mémoire situées à l'adresse $2800, le résultat est rangé en
$2900. m sur 8 bits.
1er solution :
ORG $2400
CLR.W D0 S= 0
LEA ADTAB, A0
MOVE.L #adtab, A0
boucle MOVE.B (A0)+, D1
EXT.W D1
ADD.W D1, D0 je fais l'extension pour D1 car les nombres
CMPA.L #ADTAB+100, A0 sont signés, sinon j'aurai imposé des '0' pour
BLS boucle l'extension non signée.
EXT.L D0
DIVS #100, D0 Est-ce que A0 < adtab+100 ?
MOVE.B D0, $2900 car D0 est sur 13 bits et on veut faire une
8
division (extension signée)
MOVE.B #9,D0
TRAP #15
END
2ème solution :
I sur 16 bits D2
Remarque :
L'organigramme est indépendant du µp on n'utilise
pas les noms des registres qui sont propres au 68000
Motorola.
ORG $2600
CLR.W D0
LEA adtab, A0
MOVE.B #99, D2
Loop MOVE.B (A0)+, D1 99W D2,
EXT.W D1
ADD.W D1, D0
DBF D2, loop
EXT.L D0
DIVS #100, D0
MOVE.B D0, $2900
MOVE.B #9,D0
TRAP #15
END
Remarque importante : En utilisant DBF, le registre contenant le compteur doit être sur 16 bits (W).
8 Instructions de comparaison :
• CMP.(B, W, L) source, Dn
[Dn]-source, le résultat n'est pas sauvegardé mais il affecte cependant les indicateurs d'état.
• CMPA.(W, L) source, An même remarque que CMP.
A ce niveau, si la taille est W, il y a extension de l'opérande source de W vers L, puis une comparaison
(car la destination est un registre d'adresse).
• CMPI.(B, W, L) #data, dest
• CMPM.(B, W, L) (An)+, (Am)+
9
N'utilise que ce mode d'adressage indirect post-incrémenté, comparaison dans la mémoire.
• TST.(B, W, L) dest
Comparaison de la destination avec la valeur immédiate '0' (dest – 0).
TST dest == CMPI #0, dest
9 Instructions de branchement :
10
• DBcc Dn, adresse
D: Decrement and
B : Branch
Et le résultat :
11
• Puis l'opération s'effectue sur [[An]]
Exp. : CLR.L -(A4)
Avant exécution : [A4] = $2800
Après exécution : [A4] = $27FC
N.B. : Pour (A7)+ et - (A7), quand la taille utilisée est B l'incrémentation ou la décrémentation s'effectue
sur 2 unités (B == W).
Le code opération n'est pas suivi explicitement par la valeur de l'adresse effective, comme c'est le cas
pour le mode d'adressage absolu, il est suivi par une différence d'adresse codé avec C/2 sur 8 ou 16 bits
appelé déplacement :
Déplacement = adresse effective – (adresse de l'instruction de branchement + 2)
Exp. : On a déjà vu ce programme
d = $2406 – ($2412 + 2)
12
= $2406 - $ 2414
= $2406 + $ DBEC
= $ FFF2 indique qu'il y a déplacement vers le haut dans le programme
d = $F2 sur 8 bits déplacement court
ce mode d'adressage existe le programme sera translatable.
Plage de déplacement :
13