Chapitre 6: Programmation assembleur

publicité
2/16
L'assembleur VLTN
Chapitre 6:
Programmation
assembleur
> Machine rudimentaire pour l'étude pédagogique ;
> Inspiré de l'IBM 650 ;
> Stocke des valeurs de 6 chi res en base 10 ;
> 1 registre de calcul ACCU ;
> 1 registre d'instruction INST ;
> 2 registres PC et PT sur 2 chi res ;
M. Dubacq
IUT de Villetanneuse
> 2 drapeaux NUL et ERR (ACCU nul et dernier calcul avec
débordement) ;
2008 2009
> Mémoire adressable : 100 adresses (sur 2 chi res en
base 10) ;
> Codage machine : DCB (décimal codé binaire).
3/16
Mémoire et Instructions
4/16
Exécution
> Une instruction est codé par six chi res XXYYZZ ;
> VLTN peut être exécuté par un simulateur ;
> XX est le code d'opération (représente l'opération à effectuer) ;
> Un programme complet décrira la mémoire initiale et la
série d'entrées ;
> YY est l'argument ;
> mémoire initiale : dans un chier : 10 : 40 30 24 décrit
qu'à la case 10 de la mémoire, il y a l'instruction ADD 30
24 (ou bien le nombre 403 024)
> ZZ est l'adresse de prochaine instruction ;
> Pas de séparation code/données : tout emplacement
peut être l'un ou l'autre ;
> Mnémonique en quatre lettres (ou moins).
> ACCU vaut 000000, ERR et NUL valent FAUX, PC vaut 00 ;
> Disponible sur la page web http://lipn.fr/~dubacq/ ;
> Le simulateur donne les sorties et le code de n.
5/16
Instructions : Manipulations
OP
01
02
10
21
31
80
MNEM
TSTN
TSTE
SET
LOAD
STOR
GOTO
Nom
Test NUL
Test ERR
Set
Load
Store
Nothing/Goto
Effet
Si NUL, PC<-YY, sinon PC<-ZZ
Si ERR, PC<-YY, sinon PC<-ZZ
ACCU<-YY
PC<-ZZ
ACCU<-MEM[YY]
PC<-ZZ
MEM[YY]<-ACCU
PC<-ZZ
PC<-ZZ
À chaque cycle où ACCU est modi é, ERR est mis
à VRAI si débordement, FAUX sinon. NUL est mis à
VRAI si ACCU est nul. Résultat tronqué si ERR (ex :
689210+582636=2718456).
Instructions : Logique
OP
50
51
52
53
MNEM
SHFL
SHFR
ROTL
REVE
Nom
Shift left
Shift right
Rotate left
Reverse
Effet
ACCU<-ACCU
ACCU<-ACCU
ACCU<-ACCU
ACCU<-ACCU
déc. g YY col.
déc. d YY col.
rot. g YY col.
à l’envers
6/16
Instructions : Arithmétique
OP
40
41
42
43
44
45
46
47
MNEM
ADD
ADDI
ADDM
ADDL
SUB
SUBI
SUBM
SUBL
Nom
Add
Add
Add
Add
Sub
Sub
Sub
Sub
Imm.
Imm. mid.
Imm. left
Imm.
Imm. mid.
Imm. left
Effet
ACCU<-ACCU+MEM[YY]
ACCU<-ACCU+YY
ACCU<-ACCU+YY*100
ACCU<-ACCU+YY*10000
ACCU<-ACCU-MEM[YY]
ACCU<-ACCU-YY
ACCU<-ACCU-YY*100
ACCU<-ACCU-YY*10000
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
Les opérations se font en base 10 (tout est codé en binaire
en interne, mais on a programmé la table d'addition en
base 10). Quand A − B déborde (négatif), on obtient
1 000 000 + A − B.
7/16
8/16
Instructions : Entrées/Sorties
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
Usuellement, on a aussi les opérations AND, OR, XOR et
NOT. Pour un ordinateur qui utilise un codage décimal, ça
n'a pas tellement de sens.
OP
90
91
00
MNEM
READ
WRIT
EJECT
Nom
Read input
Write output
Eject (fin de travail)
Effet
MEM[YY]<-input PC<-ZZ
output<-MEM[YY] PC<-ZZ
Code de fin : YYZZ
Une entrée lue sur input est consommée (plus présente),
une sortie lue sur output est a ichée.
Le code de n est conventionnellement 0000 pour un programme qui nit normalement, le reste au choix du programmeur (par ex., un programme avec pas assez de données s'arrêterait avec 0001).
Si aucune entrée n'est disponible, READ met ERR à 1 et
renvoie un nombre aléatoire. Sinon, ERR est mis à 0.
9/16
Exemple de programme
Instructions : Indirections
OP
11
12
13
14
15
16
17
22
32
81
82
MNEM
SETL
SETM
SETR
SAVE
COPY
SWAP
SETP
LDIX
STIX
LINK
RET
Nom
SET Left
Set Middle
Set Right
Save
Copy
Swap
Set PT
Load Index
Store Index
Jump and link
Return
Effet
Left(ACCU)<-YY
Mid(ACCU)<-YY
Right(ACCU)<-YY
PT<-ACCU
ACCU<-PT
PT<-Right(ACCU) ACCU<-PT
Right(PT)<-YY
ACCU<-MEM[PTR+YY]
MEM[PTR+YY]<-ACCU
ACCU<-PC
PC<-ACCU+YY
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
PC<-ZZ
Ces instructions seront utilisées plus tard dans le cours.
Quand YY dépasse 100, on enlève 100 : +99 est donc équivalent à -1.
Mémoire dans un système moderne
> Adresses sur n bits, mots de x octets ;
> Notation hexadécimale pour les adresses ;
> 2n octets adressables, soit 2n/x mots.
Adresse
Mémoire
0x00000000
1ermot
0x00000004
2emot
0x00000008
3emot
..
.
.
.
. ←−1 mot−→
.
.
= 4 octets
..
.
.
0xFFFFFFFC
230emot
10/16
// Fichier somme2.vltn
00: 90 50 01 // READ 50 01
01: 90 51 02 // READ 51 02
02: 21 50 03 // LOAD 50 03
03: 40 51 04 // ADD 51 04
04: 31 52 05 // STOR 52 05
05: 91 52 06 // WRIT 52 06
06: 00 00 00 // EJECT 0000
// Exécution
runner somme2.vltn 000024 000048
Exit code: 0000
000072
Plus en TD...
11/16
12/16
Utilisation de la mémoire
> On distingue dans tous les systèmes modernes plusieurs
types d'utilisation de la mémoire ;
> Programme (segment de texte) contient les instructions ;
> Données (segment de données) contient les données ;
> Données statiques : début du segment de données ;
> Données dynamiques (tas) : au-dessus des données statiques ;
> Données de fonctionnement (pile) : à l'envers, jusqu'au
fond de pile ;
> Mémoire pour le noyau et emplacements reservés.
13/16
Représentation de la mémoire (en MIPS)
0x00000000
0x003FFFFF
0x00400000
0x0FFFFFFF
0x10000000
0x????????
0x????????
0x????????
0x????????
0x????????
0x????????
0x7FFFFFFF
0x80000000
0xFFFFFFFF
> Contient le code machine correspondant aux instructions ;
Reservé
Segment de texte
> Assembleur : forme textuelle, code machine : codage
binaire ;
Données statiques
> Les instructions sont consécutives dans la mémoire ;
Tas
l
l
> Exécution consécutive des instructions, sauf sauts et
branchements ;
Espace libre
Le segment de texte
14/16
> Registre PC : adresse d'instruction courante ;
> Point d'entrée déclarée par une étiquette main.
Pile
Reservé
Le segment de données statiques
15/16
16/16
La mémoire en VLTN
> Déclaration de données dont l'adresse et la taille sont
connues du début à la n du programme ;
> Répartition conventionnelle (à part adresse 0) ;
> Les étiquettes sont les seuls repères dans la mémoire
pour l'assembleur ;
> Adresses 50 (ou plus) : variables globales (équivalent du
segment de données statiques et du tas) ;
> Transformées en constantes lors de l'assemblage ;
> Adresses 99 et moins : pile (pour plus tard).
> Souvent, pseudo-instruction LoadAddress met la valeur
de l'adresse dans registre ;
> Déclaration de types de base avec valeurs initiales ;
> Quand pas d'étiquette, adressage par connaissance des
tailles des objets.
> Adresses 0 et suivantes : programme ;
Téléchargement