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