CM2 - assembleur MIPS

publicité
CM2
L’architecture MIPS32
Olivier Marchetti (CM-TD-TP)
Laurent Lambert (TD-TP)
Laboratoire d’informatique de Paris 6 – Pôle SoC – UPMC
Année 2016-2017
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Question du jour : comment programmer un ordinateur ?
Comment parler avec quelqu’un d’aussi binaire qu’un ordinateur ?
Soit en binaire ou alors... avoir un traducteur !
UNIX, l’assembleur et C
I
Comme tout SE de l’époque, UNIX fut écrit en assembleur.
I
Dennis Ritchie développa le C au début des années 70.
I
UNIX fut réécrit en C en 1972 !
L’oeuf et la poule
Qui compile le compilateur ? Comment est écrit le compilateur ? Comment concevoir
un langage de haut niveau ? ...
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
2 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Question du jour : comment programmer un ordinateur ?
Comment éviter de programmer en langage machine ?
En utilisant le langage assembleur
de l’architecture.
X Plus aucune variable
=⇒ orchestrer un va-et-vient
entre CPU et RAM.
I 32 registres utilisateur
de 32 bits chacun.
I 232 octets adressables.
X Plus aucun type
=⇒ organiser en mémoire les
données.
I Des registres dédiés (notamment pour les flottants)
I Quelques
conventions
pour la mémoire.
X Plus aucune structure de
contrôle ou structure de données
=⇒ les réinventer en jouant avec
des étiquettes assembleurs.
I Etiquetter des portions
du code assembleur.
I Des instructions
branchement.
de
I Des instructions de saut.
Programmer en ensembleur... ou se substituer au compilateur
I
Savoir précisément où écrire, où lire.
I
Savoir décomposer tous les traitements.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
3 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Présentation du MIPS32 – Généralités
MIPS – Microprocessor without Interlocked Pipeline Stages
Architecture étudiée dans cette UE... made in Stanford !
Jeu d’instructions
Architecture
I
Premier CPU en 1985.
I
32 ou 64 bits.
I
Architecture sous licence...
PS2, PSP, Nintendo,
I
Type RISC (Reduced Instruction Set Computer ).
I
Taille fixe pour les instructions.
I
Pipeline instructions (cf. dernier CM).
Facile à apprendre (régulière), suffisamment général, intéressant.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
4 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Plan
1
Instructions MIPS
Instructions arithmétiques
Instructions logiques
Instructions de transfert de données
Instructions avec constantes
Instructions de branchement
2
Structure de contrôle en MIPS
Structure de contrôle if ... then ...
Structure de contrôle if ... then ... [else]
Structure de contrôle while
Structure de contrôle for
3
Données en MIPS
Déclarer et définir des variables
Convention sur les registres
4
Entrée/Sortie en MIPS
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
5 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
1
Olivier Marchetti
Réaliser des calculs
(arithmétiques ou logiques).
CM2 – L’architecture MIPS32
Année 2016-2017
6 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : opérations arithmétiques
Quelles sont les instructions arithmétiques du MIPS ?
Soient les désignations de registres $d, $s, $t.
Addition – add
Soustraction – sub
add $d, $s, $t
sub $d, $s, $t
Au niveau registre :
Au niveau registre :
add $d, $s, $t ⇐⇒ $d ← $s + $t
Multiplication – mult
sub $d, $s, $t ⇐⇒ $d ← $s - $t
Division – div
mult $s, $t # résultat sur 64 bits
div $s, $t
Un registre 64 bits découpé en deux champs 32 bits
(notés Hi et Lo) :
Un registre 64 bits découpé en deux champs 32 bits
(notés Hi et Lo) :
mult $s, $t ⇐⇒ Hi ← pref 32($s * $t)
Lo ← suff 32($s * $t)
div $s, $t ⇐⇒ Hi ← $s % $t
Lo ← $s / $t
Remarque
Pour les grandeurs non-signée (syntaxe identique) :
addu, subu, multu, divu
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
7 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : calculer une expression arithmétique
Comment traiter une expression arithmétique C ?
I
Soit l’instruction C suivante :
I
Supposons que nous ayons quatre registres avec l’affectation suivante :
aff. reg.
val. var. prog.
$reg 1 ←
a
$reg 2 ←
b
$reg 3 ←
c
$reg 4 ←
d
(a + b) - (c + d);
Comment procéder au calcul ?
I
Tout décomposer.
I
Gérer la ressource registre.
I
Veiller à la cohérence du
calcul.
Possibilité d’utiliser d’autres registres... mais 32 registres c’est peu.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
8 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : opérations logiques
Quelles sont les instructions logiques du MIPS ?
Soient les désignations de registres $d, $s, $t.
Opérations logiques de base :
AND (bit-à-bit) – and
OR (bit-à-bit) – or
and $d, $s, $t
or $d, $s, $t
Au niveau registre :
Au niveau registre :
and $d, $s, $t ⇐⇒ $d ← $s & $t
or $d, $s, $t ⇐⇒ $d ← $s | $t
NOR – nor
XOR (bit-à-bit) – xor
nor $d, $s, $t
xor $d, $s, $t
Au niveau registre :
Au niveau registre :
nor $d, $s, $t ⇐⇒ $d ←∼($s | $t)
xor $d, $s, $t ⇐⇒ $d ← $s ^ $t
Comparaison de deux entiers :
inférieur à – slt (set on less than)
slt $d, $s, $t
Au niveau registre :
slt $d, $s, $t ⇐⇒ $d ←($s < $t)
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
9 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
Olivier Marchetti
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
CM2 – L’architecture MIPS32
Année 2016-2017
10 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : transferts de données – principes (1/4)
Comment contourner la limite des 32 mots registres ?
232 octets ≈ 4Go ! ⇒ organiser un va-et-vient registres/RAM
I Haut-niveau : l’abstraction variable dispense le programmeur de réfléchir à la localisation réelle des données.
CPU
00011110
11000101
I Assembleur : la localisation des données est inévitable.
| mot |
2
−1
| mot |
2
−2
$Reg
Pour charger (resp. décharger) un registre depuis la RAM
(resp. vers la RAM), il faut spécifier :
I une adresse de base stockée dans $s,
I une valeur de décalage C (une constante entière),
C
valeur de $s
valeur de $s
I le registre contenant (resp. recevant) la donnée.
01001100
L’adresse d’écriture/lecture en RAM sera :
11100000
00101101
RAM[$s + C]
RAM @
Remarques
I Contient données/programmes
I Le registre $s indique la granularité de la donnée à charger
(i.e. un multiple de quelques octets).
I Par défaut, un transfert RAM → registre copie quatre
octets.
Olivier Marchetti
2
1
0
CM2 – L’architecture MIPS32
I Entièrement adressée (par octet)
I Formée de mots
=⇒ la RAM n’est qu’un grand tableau.
Année 2016-2017
11 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : transferts de données – syntaxe (2/4)
Instructions MIPS pour les transferts registres/mémoire :
Chargement d’un registre – lw (load word)
CPU
00011110
lw $t, C($s)
11000101
Au niveau registre/RAM :
| mot |
2
−1
| mot |
2
−2
$Reg
lw $t, C($s) ⇐⇒ $t ← RAM[$s + C]
C
Déchargement d’un registre – sw (store word)
valeur de $s
sw $t, C($s)
valeur de $s
01001100
Au niveau registre/RAM :
sw $t, C($s) ⇐⇒
11100000
RAM[$s + C] ← $t
00101101
2
1
0
RAM @
C désigne une constante sur 16 bits, alors que $s est sur 32 bits.
Remarques
Traiter des mots de taille moindre (syntaxe identique) :
I lh, sh : charge / décharge un 1/2-mot (load/store half ),
I
lb, sb : charge / décharge un octet (load/store bytes).
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
12 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : transferts de données – exemples (3/4)
Exemple 1
I
Soit tab[] un tableau d’entiers 32 bits d’adresse stockée dans le registre $v1.
I
Soient deux variables x et y associées respectivement aux registres $v2 et $v3.
Quel serait l’équivalent MIPS de l’instruction C : y = x + tab[5];
Exemple 2
I
Soit tab[] un tableau d’entiers 16 bits d’adresse stockée dans le registre $v1.
I
Soit une variable x associée au registre $v2.
Quel serait l’équivalent MIPS de l’instruction C : tab[1] = x + tab[10];
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
13 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : transferts de données – problème d’alignement (4/4)
Que se passe-t-il si le calcul d’adresse est erroné ?
I
Soit tab[] un tableau contenant
0, 1, 2...
Mots chargés
par le programmeur
I
Ces entiers sont encodés sur 32
bits (i.e. 4 octets).
0
I
I
1
L’adresse mémoire de ce tableau
est dans $t.
0
Le programmeur, étourdi, charge
cependant les valeurs par :
0
00000000
00000000
tab[1] = 1
00000000
00000001
00000000
00000000
tab[0] = 0
00000000
00000000
adr_tab[]
lh $s, C($t).
avec la constante C prise dans 0,
2, 4...
RAM
@
=⇒ données mal lues
Alignement mémoire
I
Une donnée est alignée si son adresse mémoire est multiple de sa taille en octet.
• Exemple : les entiers sur 4 octets ont des adresses multiples de 4.
I
La RAM étant entièrement adressée, il faut veiller à lire correctement les données.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
14 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
Olivier Marchetti
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
3
Manipuler des constantes.
CM2 – L’architecture MIPS32
Année 2016-2017
15 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : manipuler des constantes dans le code assembleur (1/3)
Comment un programmeur peut-il utiliser des constantes dans son code MIPS ?
Un peu de bricolage
Problème d’efficacité
Soit $AdrC stockant l’adresse mémoire d’un
emplacement contenant la constante 10.
lw $d, 0($AdrC)
add $d, $d, $s
#
#
$d ← 10
$d ← 10 + $s
I
un chargement en mémoire
est coûteux en temps.
I
usage fréquent de petites
constantes.
=⇒ manipuler directement les constantes dans l’assembleur MIPS
Opérations arithmétiques à chargement immédiat (avec C sur 16 bits) :
Addition immédiate – addi
Soustraction immédiate – subi
addi $d, $s, C ⇐⇒ $d ← $s + C
subi $d, $s, C ⇐⇒ $d ← $s - C
Opération logiques à chargement immédiat (avec C sur 16 bits) :
AND immédiat (bit-à-bit) – andi
OR immédiat (bit-à-bit) – ori
andi $d, $s, C ⇐⇒ $d ← $s & C
ori $d, $s, C ⇐⇒ $d ← $s | C
Test inférieur à immédiat – slti (set on less than immediate)
slti $d, $s, C ⇐⇒ $d ← ($s < C)
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
16 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : manipuler des constantes dans le code assembleur (2/3)
Comment manipuler (24 × 60 × 60 = 86400)10 = (10101000110000000)2 ?
Un peu de bricolage
Décalage de bit – sll, srl (shift left/right
logical)
La construire par étape en obervant que :
16 15
sll/srl $d, $s, dec
0
# dec < 25
( 1 0 101000110000000)2 = (0000000000000001)2 × 216
+ (0101000110000000)2
Au niveau registre :
Avec cette décomposition et $d contenant 0, nous avons :
sll $d, $s, dec ⇐⇒ $d ← $s × 2dec
addi $d, $d, 1
sll $d, $d, 16
addi $d, $d, 0x5180
Au niveau registre (et si $d est un entier
positif),
# $d ← 0 + 1
# $d ← $d × 216
# $d ← $d + 0x5180
srl $d, $s, dec ⇐⇒ $d ← $s ÷ 2dec
Un peu lourd...
=⇒ MIPS permet de charger un petit entier sur les 16 bits du poids fort d’un registre !
Chargement poids fort immédiat – lui
(load upper immediate)
lui $d, C
valeur
Au niveau registre :
lui $d, C
⇐⇒
$d ← C << 16
15
0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
chargement
31
0
16 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Compléter par un addi ensuite...
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
17 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : manipuler des constantes dans le code assembleur (3/3)
Comment faire une affectation en assembleur ?
=⇒ Variable = concept inexistant au niveau assembleur
=⇒ Gestion des ressources matérielles (RAM, registres)
La question serait davantage :
Comment le programmeur charge-t-il ses registres ?
Depuis la RAM ou un registre
Avec un immédiat
lw $t, C($s)
# $t ← RAM[$s + C]
addi/ori $d, $s, 0
# $d ← $s
add/or $d, $s, $zero
# $d ← $s
addi/ori $d, $zero, C
# $d ← C
Remarques
I Le registre $zero (ou $0) contient toujours...
I 32 registres, c’est peu !
=⇒ décharger certains registres avec sw.
I Les instructions or/ori sont un peu plus rapides que add/addi.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
18 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
Olivier Marchetti
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
3
Manipuler des constantes.
4
Pouvoir réaliser des
branchements sur le code.
CM2 – L’architecture MIPS32
Année 2016-2017
19 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Assembleur MIPS : prendre des décisions
Comment guider le flot d’instructions en MIPS ?
Programme enregistré – rappels
I Données et programmes
sont stockés en mémoire.
I La
mémoire
est
entièrement adressée.
I Une instruction est un
mot mémoire.
I Un programme n’est
qu’une suite de mots.
=⇒ indiquer à l’ordinateur l’adresse de la prochaine instruction à exécuter.
Instructions de branchement conditionnel MIPS :
Branchement sur égalité – beq (branch on equal)
Branchement non-égalité – bne (branch on not equal)
beq $s, $t, Ad Etq
bne $s, $t, Ad Etq
Au niveau registre :
Au niveau registre :
Si ($s == $t) alors PC ← PC + 4 + 4×Ad Etq
Olivier Marchetti
Si ($s != $t) alors PC ← PC + 4 + 4×Ad Etq
CM2 – L’architecture MIPS32
Année 2016-2017
20 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Arithmétiques ? Logiques ? Transfert ? Constantes ? Branchement
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
Olivier Marchetti
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
3
Manipuler des constantes.
4
Pouvoir réaliser des
branchements sur le code.
5
Disposer de structures de
contrôle classiques.
CM2 – L’architecture MIPS32
Année 2016-2017
21 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
IfThen ? IfThenElse ? While ? For ?
Assembleur MIPS : if ... then ...
Comment traduire un simple if d’un code C ?
Si $r est assigné à note archi :
Soit le code C suivant :
if (note archi < 0)
note archi = 0;
note archi += 1;
=⇒ la programmation assembleur, ce n’est rien que des goto étiquette !
Pseudo-instructions assembleur MIPS
Les instructions MIPS sont :
√
quasi-implémentées en matériel,
=⇒ pas très pratique pour coder...
X mais très peu nombreuses (57 au total).
Pseudo-instructions MIPS :
√
remplacent
des
petites
portions
de MIPS fréquentes (mais non
implémentées dans le matériel),
√
basées sur le instructions réelles du
MIPS.
√
utilisent un registre intermédiaire
spécifique ($at).
Olivier Marchetti
Exemple :
move $d, $r ⇐⇒ addi $d, $r, 0
bge $s, $t, Etq ⇐⇒ slt $at,$s,$t
beq $at,$zero, Etq
avec :
I bge : branch if greater than or equal,
I le registre $at réservé à l’assembleur.
CM2 – L’architecture MIPS32
Année 2016-2017
22 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
IfThen ? IfThenElse ? While ? For ?
Assembleur MIPS : définir une condition
Comment écrire en assembleur ?
Soit le code C suivant :
if (note archi < 0)
note archi = 0;
note archi += 1;
La séquence semble la même...
La condition logique a été niée !
Si $r est assigné à note archi :
1|
bge $r, $0, SUITE
2|
move $r, $0
3| SUITE : addi $r, $r, 1
Langage haut-niveau vs. assembleur MIPS : méthodologie
I
En assembleur : une instruction par ligne.
I
Nombre d’opérandes par instruction déterminé par l’ISA.
I
Instructions et opérandes sont tous adressés.
L’ordinateur effectue en permanence le cycle chercher, décoder, exécuter . En
d’autres termes :
lecture ligne après ligne,
adresse après adresse,
instruction après instruction.
Ce fonctionnement glouton contraint le programmeur à adapter son écriture.
=⇒ astuce : nier la condition logique pour préserver l’ordre initial.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
23 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
IfThen ? IfThenElse ? While ? For ?
Assembleur MIPS : if ... then ... [else]
Comment traduire un simple if ... then ... [else] d’un code C ?
Soit le code C suivant :
if (note archi < 0)
note archi = 0;
else
note archi += 1;
Première tentative en MIPS :
1|
bge $r, $0, SINON
2|
move $r, $0
3| SINON : addi $r, $r, 1
Problème : à l’exécution, on ajoute toujours 1 pt !
l’adresse d’une instruction ≈ numéro ligne
=⇒ effectuer des sauts d’instructions grâce aux adresses !
Instruction de branchement inconditionnel MIPS (saut) :
if ... then ... [else] en MIPS
Saut sur étiquette – j Etq (jump)
Insérer un saut d’instruction :
j Etq
Au niveau registre :
j Etq ⇐⇒ PC ← PC + 4[31...28].4×Ad Etq
avec concaténation des premiers bits $PC et ceux de l’étiquette.
Olivier Marchetti
CM2 – L’architecture MIPS32
1|
2|
3|
4| SINON :
5| SUITE :
bge $r, $0, SINON
move $r, $0
j SUITE
addi $r, $r, 1
Année 2016-2017
24 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
IfThen ? IfThenElse ? While ? For ?
Assembleur MIPS : tant que ... faire
Boucle
tant que ... faire en C
while (notes archi[i++] >= 0)
nb notes archi += 1;
Soient les assignations suivantes :
I l’adresse du tableau note archi[] est stockée dans le registre $t0,
I le registre $ind contient la valeur de la variable i,
I le registre $n contient la valeur de la variable nb notes archi,
I les registres $t1, $t2, $t3 contiennent respectivement :
• la valeur 4,
• la valeur intermédiaire 4 × i,
• la ie valeur du tableau note archi[].
Boucle tant que ... faire en MIPS
1| TANTQUE :
2|
3|
4|
5|
6|
7|
8| SUITE :
Olivier Marchetti
mul $t2, $t1, $ind
add $t0, $t0, $t2
lw $t3, 0($t0)
blt $t3, $zero, SUITE
addi $n, $n, 1
addi $ind, $ind, 1
j TANTQUE
#
#
#
#
#
#
#
$t2 ← 4 × i
$t0 ← @notes archi[i]
$t3 ← notes archi[i]
test logique nié
incrémentation
incrémentation
saut vers TANTQUE
CM2 – L’architecture MIPS32
Autres pseudo-instructions
I mul : retourne les
32 bits de poids
faible du produit des
opérandes.
I blt : branch on lower
than.
Année 2016-2017
25 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
IfThen ? IfThenElse ? While ? For ?
Assembleur MIPS : Pour ... faire
Boucle
Pour (i allant de 0 à n - 1) faire en C
for (i = 0; i < n; i++) {
instructions for
}
En considérant que l’assignation de registres suivante :
I $r contient la valeur de i,
I
$t contient la valeur de n,
$test stocke le résultat d’un calcul intérmédiaire,
une telle boucle se programme ainsi en MIPS :
I
Boucle
Pour (i allant de 0 à n - 1) faire en MIPS
1|
add $r , $zero, $zero
2| POUR : slt $test, $r, $t
3|
beq $test, $zero, SUITE
4|
...
5|
addi $r, $r, 1
6|
j POUR
7| SUITE :
Olivier Marchetti
#
#
#
#
#
#
$r ← 0 + 0
$test ← 0 si i >= n
saut vers la suite du code
corps de la boucle
incrémentation compteur
saut en début de boucle
CM2 – L’architecture MIPS32
Année 2016-2017
26 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Déclarer/Definir des données ? Convention sur les registres
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
Olivier Marchetti
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
3
Manipuler des constantes.
4
Pouvoir réaliser des
branchements sur le code.
5
Disposer de structures de
contrôle classiques.
6
Disposer de variables déclarées
et définies.
CM2 – L’architecture MIPS32
Année 2016-2017
27 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Déclarer/Definir des données ? Convention sur les registres
Assembleur MIPS : déclarer et définir des variables (1/3)
Langage haut-niveau vs. assembleur
I
Haut-niveau : l’abstraction variable dispense le programmeur de réfléchir à la
localisation réelle des données.
I
Assembleur : la localisation des données est inévitable.
Segments mémoire MIPS et programme C :
le segment texte .text contient les instructions
du programme.
dispo.
=⇒ $pc : adresse de l’instr. exécutée.
I
le segment des données .data contient
Tas
• données statiques (variable globales ou
statiques),
=⇒ $gp : adresse du seg. des données.
• la mémoire dynamique gérée dans le tas
(xxxalloc() en C).
données stat.
$gp
.data
Programme
$pc
.text
Mémoire du programme
Mem.
Seg. texte Seg. données
I
Les tailles (et donc les adresses) de ces segments sont calculées à la compilation.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
28 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Déclarer/Definir des données ? Convention sur les registres
Assembleur MIPS : déclarer et définir des variables (2/3)
Comment indiquer en MIPS où, comment, et quoi stoker ?
Indiquer le segment mémoire
Décrire la visibilité
I .text [adr] : la donnée sera dans le segment
texte (i.e. avec les instructions du programme
– à l’adresse adr si fournie).
I .data [adr] : la donnée sera stockée dans
le segment des données (à l’adresse adr si
fournie).
I .stack : la donnée sera sur la pile (cf. CM3).
I extern Etq taille : déclare la donnée enregistrée à l’adresse Etq sur taille octets
consécutifs comme étant globale au fichier.
Place la donnée dans le segment des données.
I globl Etq : déclare l’étiquette Etq est un
symbole globale visible dans d’autres fichiers
assembleur.
I k{text,data} : la donnée sera dans le segment {texte, données} du noyau du système
d’exploitation.
S’apprend à l’usage...
Décrire et enregistrer les données
Les enregistrements mémoire suivants sont réalisés à des adresses consécutives.
I align n : réalise l’alignement mémoire de la
donnée suivante sur une frontière de 2n octects.
I space n : définit un espace de n octets
consécutifs dans le segment des données.
I ascii ch : enregistre en mémoire la chaı̂ne
de caractère ch sans le caractère de fin de
chaı̂ne.
I asciiz ch : idem, mais avec le caractère de
fin de chaı̂ne.
Olivier Marchetti
I byte b1 ,...,bn : enregistre n octets.
I double d1 ,...,dn : enregistre n flottants
double précision.
I float f1 ,...,fn : enregistre n flottants
simple précision.
I half h1 ,...,hn : enregistre n quantités 16
bits (alignement demi-mot).
I word w1 ,...,wn : enregistre n quantités 32
bits (alignement mot).
CM2 – L’architecture MIPS32
Année 2016-2017
29 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Déclarer/Definir des données ? Convention sur les registres
Assembleur MIPS : déclarer et définir des variables (3/3)
Comment structurer un fichier assembleur MIPS ?
Fichier MIPS type
Etiquettes Dir{Seg. mém, visib., données} – Instr.
Commentaires
↓
↓
↓
.data
tab ent : .word 1,2,3,4
...
...
...
.text
.globl main
# main devient global
...
...
...
main :
la $r, tab ent
# charge tab entier dans $r
...
...
...
Ecriture MIPS
I
Une instruction par ligne.
I
Etiquettes en début de ligne suivies de
I
Idenfiticateur : idem au C.
I
Pas de commentaires multilignes.
Olivier Marchetti
: .
CM2 – L’architecture MIPS32
Année 2016-2017
30 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Déclarer/Definir des données ? Convention sur les registres
Assembleur MIPS : convention d’usage des registres
Peut-on utiliser comme l’on veut chacun des 32 registres ?
Pas vraiment : contraintes matérielles (fortes) et conventions logicielles.
Noms et numéros de registres
Nom
$zero
$at
$v0–$v1
$a0–$a3
$t0–$t7
$s0–$s7
$t8–$t9
$k0–$k1
$gp
$sp
$fp
$ra
Numéro
$0
$1
$2–$3
$4–$7
$8–$15
$16–$23
$24–$25
$26–$27
$28
$29
$30
$31
Fonct. conv.
constante 0
Rés. assembleur
Val. retour et Rés. fonction
Arg. fonct.
Temp.
Temp. sauv.
Temp.
Rés. noyau SE
Pointeur global
Pointeur pile
Pointeur bloc
Adr. retour
I Le programme utilise d’autres programmes.
I Le SE veille.
Nombre de conventions seront expliquées lors du CM3.
Contraintes matérielles
Conventions logicielles
X $zero contient toujours la valeur zéro.
X $ra utilisé pour le flot des instructions.
=⇒ Ensemble de conventions déterminant
le bon usage de l’architecture (programme, compilation).
X ($HI, $LO) (ALU) utilisés pour (mult, div)
=⇒ A respecter.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
31 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Programmation C vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
Olivier Marchetti
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
3
Manipuler des constantes.
4
Pouvoir réaliser des
branchements sur le code.
5
Disposer de structures de
contrôle classiques.
6
Disposer de variables déclarées
et définies.
7
Effectuer des entrées/sorties
élémentaires.
CM2 – L’architecture MIPS32
Année 2016-2017
32 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Assembleur MIPS : effectuer des entrées/sorties élémentaires
Comment réaliser une E/S élémentaire ?
Réaliser un appel système - méthodologie
1
2
Ecrire l’instruction pour charger le service voulu dans le registre $v0.
[ Ecrire les instructions pour charger des arguments dans les registres $a0,
$a1... (cf. documentation MIPS).]
3
Ecrire l’instruction syscall.
4
[ Ecrire les instructions pour récupérer une valeur de retour de l’appel
syscall. ]
Service
Code Service Arguments
afficher entier
1
$a0 : stocke l’entier voulu
afficher ch. car.
4
$a0 : adresse de la chaı̂ne
lire entier
5
lire ch. car.
8
Valeur de retour
$v0 : entier lu
$a0 : adresse du tampon
$a1 : nb. max. car. lus
exit
Olivier Marchetti
10
CM2 – L’architecture MIPS32
Année 2016-2017
33 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Assembleur MIPS : effectuer des entrées/sorties élémentaires – exemple
Ecrire en assembleur MIPS le programme qui affiche ”hello world”.
L’instruction la (pour load address) permet de charger dans un registre une
adresse.
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
34 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Assembleur vs. langage de haut-niveau : conclusion
Pourquoi écrire en langage assembleur alors qu’un langage de haut-niveau est
finalement beaucoup plus intuitif ?
Langage Assembleur
I
Langage haut-niveau
Contrôle très fin du matériel
(presque au niveau cycle).
I
Les archis passent... les langages
haut-niveau restent !
=⇒ le C a plus de 40 ans !
=⇒ très utile dans l’embarqué
I
I
I
Facilité d’écriture.
=⇒ très grande hétérogénéité du
matériel et donc des ISA.
I
Compilateurs de plus en plus performants.
Peu intuitif.
I
Certaines architectures ne sont exploitables qu’en langage assembleur.
I
Difficile d’effectuer des choses très
fines (e.g. temps réel).
Exploitation maximale des fonctionnalités offertes par le matériel.
=⇒ accroı̂t la productivité !
=⇒ entretien laborieux...
I
Codes sources très longs.
=⇒ productivité divisée !
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
35 / 36
Instructions MIPS ? Contrôle ? Données en MIPS ? E/S en MIPS
Rendre à César ce qui est à César
Références bibliographiques utilisées
Organisation et conception des ordinateurs
Dunod.
I I
, J. Hennessy & D. Patterson,
en.wikipedia.org et diverses ressources...
Images utilisées
I
Image du transparent 18 :
Sujet :
Source :
Licence :
I
smileys.
openclipart.org.
domaine public.
Image du transparent 31 : échangeur autoroutier Los Angeles-Pasadena-SantaMonica (auteur : inconnu).
Olivier Marchetti
CM2 – L’architecture MIPS32
Année 2016-2017
36 / 36
Téléchargement