Approche vulgarisée
Transcription
Approche vulgarisée
Centre Universitaire Bordj Bou Arreridj Institut de technologie département d’Informatique Architecture des Ordinateurs 2eme année LMD Informatique A. Mehemmel 2008-2009 Préface L’architecture des ordinateurs est l’étude et la description du fonctionnement des composants internes d’un ordinateur. Elle traite : le type des informations manipulées et de leur codage, le dialogue entre composants, et le fonctionnement logique (pas électrique) interne des composants. Nous abordons ce cours avec un chapitre sur l’architecture de la machine de Von Neumann, les relations entre le processeur et la mémoire, le concept d'instruction et de langage machine et le codage des différents types de données en mémoire. Le chapitre suivant porte sur l'architecture externe d'un processeur industriel 32 bits MIPS R3000, qui consiste à initier les étudiants à la programmation en assembleur, On présente ici successivement les registres visibles du logiciel, l’organisation et les règles d’adressage de la mémoire, les différentes conventions relatives à l’écriture des programmes en langage d’assemblage, les instructions, les directives acceptées par l’assembleur, les quelques appels système disponibles. Le chapitre 3 porte sur la programmation structurée et les appels de procédures, L'utilisation de la pile pour les variables locales, les sauvegardes de contextes, et le passage des paramètres. Le chapitre 4 traite la conception du jeu d’instructions, le codage, l’architecture interne MIPS R3000, le chemin des données et le principe de la microprogrammation. Le chapitre 5 est une introduction aux mécanismes de traitement des interruptions et des exceptions. Et enfin un chapitre sur les architectures pipelines. Ce recueil est un support auxiliaire, sa lecture ne devra pas remplacer la présence (active, attentive et intéressée!) aux cours et aux TD, la recherche bibliographique et la lecture des autres textes dans ce domaine restent les meilleurs moyens pour approfondir vos connaissances. Mehemmel Abbas Chargé de cours Centre universitaire de Bordj Bou Arreridj Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels Révision: CHAP 0 Ce chapitre est une révision des cours présentés en première année. Il présente un pré requis pour ce module. En résumé, vous avez une semaine pour lire, comprendre et faire tous les exercices qui vous seront proposés sur cette partie. Si vous trouvez des difficultés, demandez des explications à vos enseignants de TD. I. Systèmes de numération 1. Introduction : Depuis le début des temps, des dizaines de systèmes de numération ont été créés pour répondre à des besoins de mesures de quantité et de grandeur. On raconte, qu'avant l'avènement d’un système de numération, un berger se servait de cailloux pour compter les moutons. C'est à partir de besoins de cette nature que les systèmes de numération ont été inventés. Notre système de numération repose essentiellement sur la base 10 (surement à cause des 10 doigts des deux mains). On trouve aussi un certain nombre d'occurrences de nombres exprimés dans d'autres systèmes de notation, telle que la base 60 pour compter les secondes et les minutes, la base 12 pour compter les heures, etc. L'ordinateur a 2 états significatifs (impulsion électriques). Le système de numération qu'il emploie est donc le système binaire. Il est donc nécessaire de développer des techniques de conversions de notation afin de pouvoir transcrire des nombres d'un système de notation dans un autre. A titre d'exemple, les ordinateurs actuels convertissent constamment les nombres représentés en base 10 vers un système en base 2. Ce paragraphe présente, quelques méthodes de conversion, nous utiliserons les bases 2, 8,10 et16. 2. Généralités. Définition : Une base est le nombre par lequel on doit multiplier une unité pour passer d’un ordre au suivant. C’est le nombre qui sert à définir un système de numération. La base du système décimal est 10 alors que celle du système octal est 8. D'une manière générale, le nombre anan-1...a2a1a0 si il est exprimé en base b ne pourra comporter que des chiffres ai compris entre 0 et b-1. Notons ai la suite des chiffres utilisés pour écrire un nombre x = an an-1 ... a1 a0 a0 est le chiffre des unités. • • • • En décimal, b=10, ai ∈ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; En binaire, b=2, ai ∈ { 0, 1 } : 2 chiffres binaires, ou bits; En Octal ; b = 8; ai ∈ { 0, 1, 2, 3, 4, 5, 6, 7}; En hexadécimal, b=16, ai ∈ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F } (on utilise les 6 premières lettres comme des chiffres). La notation ( )b indique que le nombre est écrit en base b. Nous utiliseront aussi les lettres B, ∅, H à la fin d’un nombre écrit en binaire, en octale ou en hexadécimal. 3. Ecriture des nombres entiers En base 10, on écrit par exemple 1986 pour représenter le nombre 1986 = 1*103 + 9*102 + 8*101 + 6*100 1 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels Dans le cas général, en base b, le nombre représenté par une suite de chiffres an an-1 ... a1 a0 est donné par: an * bn + an-1 * bn-1 + ... + a2 * b2 + a1 * b + a0 calculée en base 10. a0 est le chiffre de poids faible, et an le chiffre de poids fort. Exemple: ( 101101 )2 = 1*25+0*24+1*23+1*22+0*21+1*20=32+8+4+0+1 = 45 3 2 (6172)8 = 6*8 + 1*8 + 7*8 + 2 = 3194 4 3 2 (7A8BD)16 = 7*16 +10*16 +8*16 +11*16 +13 = 501949 Remarque: Dans un système à base b et sur n positions. On peut représenter les nombres de n 0 à (b - 1) 4. Ecriture des nombres fractionnaires Les nombres fractionnaires sont ceux qui comportent des chiffres après la virgule. Dans le système décimal, on écrit par exemple: 12,346 = 1*101 + 2*100 + 3*10-1 + 4*10-2 + 6*10-3 En général, en base b, on écrit: an an-1 ... a1 a0, a-1 a-2 ... a-p = an bn + an-1bn-1 + ... + a0 b0 + a-1 b-1 + ... + a-p b-p Exemple: -1 -2 -3 -4 4 (11.1011)2 = 1*2+1+ 1* 2 + 0 *2 + 1 * 2 + 1* 2 = 3 + (1011)2 /2 = 3.6875 -1 -2 -3 (0.307)8 = 3 * 8 + 0 * 8 + 7* 8 = (307)8 / 83 = 0.388671875 -1 -2 -3 3 (0.0F4)16 = 0 * 16 + 15* 16 + 4* 16 = (F4)16 /16 = 0.059570312 5. Opérations arithmétiques Les opérations arithmétiques s'effectuent en base quelconque b avec les mêmes méthodes qu'en base 10. Une retenue ou un report apparaît lorsque l'on atteint ou dépasse la valeur b de la base. 6. Passage d'une base quelconque à la base 10 En exposant les principes des systèmes de numération de position, nous avons déjà vu comment convertir les nombres de base 8, base 2 et base 16 en nombres décimaux. Exemple en hexadécimal: (AB)16 = 10*161 + 11*160 =160 + 11 = 171 7. Passage de la base 10 vers une base quelconque Nombres entiers On procède par divisions successives. On divise le nombre par la base, puis le quotient obtenu par la base, et ainsi de suite jusqu'a obtention d'un quotient nul. La suite des restes obtenus correspond aux chiffres dans la base visée, a0 a1 ... an. Exemple: 44 = ( ? )2. 44 ÷ 2 = 22 reste 0 a0 = 0 22 ÷ 2 = 11 reste 0 a1 = 0 11 ÷ 2 = 5 reste 1 a2 = 1 5 ÷ 2 = 2 reste 1 a3 = 1 2 ÷ 2 = 1 reste 0 a4 = 0 2 2eme année LMD Informatique Architecture des Ordinateurs 1 ÷ 2 = 0 reste 1 a5 = 1 1383 172 21 2 1383 = ( ? )8 ÷ 8 = 172 ÷ 8 = 21 ÷ 8 = 2 ÷ 8 = 0 31838 1989 124 7 31838 = ( ? )16 ÷ 16 = 1989 ÷ 16 = 124 ÷ 16 = 7 ÷ 16 = 0 reste reste reste reste 7 4 5 2 CHAP I : Rappels Donc 44 = (101100)2. 1383 = (2547) 8 reste reste reste reste 14 = EH 5 12 = CH 7 31838 = (7C5E) 16 Nombres fractionnaires On multiplie la partie fractionnaire par la base en répétant l'opération sur la partie fractionnaire du produit jusqu'a ce qu'elle soit nulle (ou que la précision voulue soit atteinte). Pour la partie entière, on procède par divisions comme pour un entier. Exemple: conversion de 54,25 en base 2 Partie entière: 54 = (110110)2 par divisions. Partie fractionnaire: 0.25 * 2 = 0.5 0.5 * 2 = 1.0 0.0 * 2 = 0.0 a-1 = 0 a-2 = 1 a-3 = 0 donc 54.25 = (110110.01)2 0.6875 = ( ? )2 0.6875 * 2 = 1 . 375 0.375 * 2 = 0 . 75 0.75 * 2 = 1.5 0.5 * 2 = 1.0 0.6875 = (0,1011) 2 0.6953125 = 0.6953125 * 8 0.5625 * 8 0.5 * 8 0.6953125 = (0.544)8 ( = = = ? )8 5.5625 4.5 4.0 0.3 = (0.2 3146 3146 3146) 8 0.6 = ( ? )16 0.6 * 16 = 9 . 6 0.6 * 16 = 9 . 6 0.6 = (0.99999) 16 Cas des bases 2, 8 et 16 Ces bases correspondent à des puissances de 2 (21, 23 et 24), d'où des passages de l'une à l'autre très simples. Les bases 8 et 16 sont pour cela très utilisées en informatique, elles permettent de représenter rapidement et de manière compacte des configurations binaires. La base 8 est appelée notation octale, et la base 16 notation hexadécimale. 0T 0T 0T 0T Chaque chiffre en base 16 (24) représente un paquet de 4 bits consécutifs. Par exemple: (1010011011)2 = (0010 1001 1011)2 = (29B)16 3 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels De même, chaque chiffre octal représente 3 bits. II. (10 011 000 111 110)2 = (23076)8 (10 1010 0001 1101 1100)2 = (2A1DC)16 (0.101 110 011 010 010)2 = (0.56322) 8 (0.1011 0011 0100 1000)2 = (0.B348) 16 (23.3501)8 = (10 011.011 101 000 001) 2 (12.C08)16 = (1 0010.1100 0000 1000) 2 Codage de données 1. Introduction Les informations traitées par un ordinateur peuvent être de différents types (texte, nombres, etc.) mais elles sont toujours représentées et manipulées par l'ordinateur sous forme binaire. Toute information sera traitée comme une suite de 0 et de 1. Le codage d'une information consiste à établir une correspondance entre la représentation externe (habituelle) de l'information (le caractère A ou le nombre 36 par exemple), et sa représentation interne dans la machine, qui est une suite de bits. On utilise la représentation binaire car elle est simple, facile à réaliser techniquement. Le Bit Bit signifie "binary digit", c'est-à-dire 0 ou 1 en numérotation binaire. C'est la plus petite unité d'information manipulable par une machine. On peut le représenter physiquement: • par une impulsion électrique qui correspond à la valeur 1 ou une absence d'impulsion qui correspond à la valeur 0. • par des alvéoles ou des espaces dans une surface (CD-ROM) • grâce à des bistables, c'est-à-dire des composants qui ont deux états d'équilibre (un correspond à l'état 1, l'autre à 0) Avec un bit on peut avoir deux états différents : soit 1, soit 0. Avec 2 bits on peut avoir quatre états différents (2*2): 0 0 0 1 1 0 11 Avec 3 bits on peut avoir huit états différents (2*2*2): 000 001 010 011 100 101 110 111 Avec 8 bits on a 2*2*2*2*2*2*2*2=256 possibilités, c'est ce que l'on appelle un octet. Cette notion peut être étendue à n bits : on a alors 2n possibilités. L'octet L'octet est une unité d'information composée de 8 bits. Il permet de stocker un caractère, tel qu'une lettre, un chiffre ... Un kilo-octet (Ko) ne vaut pas 1000 octets mais 210 octets = 1024 octets Un méga-octet (Mo) vaut 210 Ko = 1024 Ko = 220 octets = 1 048 576 octets Un giga-octets (Go) vaut 210 Mo = 1024 Mo = 230 octets = 1 073 741 824 octets Un téra-octet (To) vaut 210 Go = 1024 Go = 240 octets = 1 099 511 627 776 octets Les octets sont regroupés en mot-mémoire. La longueur d'un mot-mémoire varie d'une machine à l'autre (8, 16, 24, 32, 64 bits) la longueur des mot-mémoires est une caractéristique importante dans l'architecture d'un ordinateur. 4 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels 2. Codification des nombres entiers La représentation (ou codification) des nombres est nécessaire afin de les stocker et manipuler par un ordinateur. Le principal problème est la limitation de la taille du codage: un nombre mathématique peut prendre des valeurs arbitrairement grandes, tandis que le codage dans l'ordinateur doit s'effectuer sur un nombre de bits fixé. Entiers naturels (non signés) Les entiers naturels (positifs ou nuls) sont codés sur un nombre d'octets fixé (un octet est un groupe de 8 bits). On rencontre habituellement des codages sur 1, 2 ou 4 octets, plus rarement sur 64 bits (8 octets, par exemple sur les processeurs DEC Alpha). Un codage sur n bits permet de représenter tous les nombres naturels compris entre 0 et 2n-1. Par exemple sur 1 octet, on pourra coder les nombres de 0 à 255 = 28-1. On représente le nombre en base 2 et on range les bits dans les cellules binaires correspondant à leur poids binaire, de la droite vers la gauche. Si nécessaire, on complète à gauche par des zéros (bits de poids fort). Entiers relatifs (signés) Il faut ici coder le signe du nombre. On utilise le codage en complément à deux, qui permet d'effectuer ensuite les opérations arithmétiques entre nombres relatifs de la même façon qu'entre nombres naturels. 1. Entiers positifs ou nuls: On représente le nombre en base 2 et on range les bits comme pour les entiers naturels. Cependant, la cellule de poids fort est toujours à 0: on utilise donc n-1 bits. Le plus grand entier positif représentable sur n bits en relatif est donc 2n-1 - 1. 2. Entiers négatifs: Soit x un entier positif ou nul représenté en base 2 sur n-1 bits La représentation de -x est obtenue par (-x) + (x) = 2n. On dit complément vrai (à deux). Pour obtenir le codage d'un nombre x négatif, on code en binaire sa valeur absolue sur n-1 bits, puis on complémente (inverse) tous les bits et on ajoute 1. Exemple: soit à coder la valeur -2 sur 8 bits. On exprime 2 en binaire, soit 00000010. On inverse les bits On obtient 11111101. On ajoute 1 et on a le résultat: 1111 1110. Remarques: a. le bit de poids fort d'un nombre négatif est toujours 1; b. sur n bits, le plus grand entier positif est 2n-1 - 1 = 011….1; c. sur n bits, le plus petit entier négatif est -2n-1. Sur 8 bits on peut donc représenter les nombres: 5 2eme année LMD Informatique Architecture des Ordinateurs CHAP I : Rappels Opération arithmétique et débordement (Overflow): Les opérations d’additions et de soustractions se déroulent normalement comme en binaire. Il y a débordement si le résultat n’appartient pas à l’intervalle des entiers représentables. Le débordement peut être détecté: • en comparant le signe des opérandes au signe du résultat: s'il y a contradiction, il y a débordement, ou • en comparant la retenue entrante dans le bit de poids fort avec la retenue sortante : s'ils sont différents, il y a débordement. Exemple: 3. Représentation des nombres réels (norme IEEE) Plusieurs représentations possibles : • • • virgule fixe : revient à manipuler des entiers (caisses enregistreuses) couple (numérateur, dénominateur): représentation juste uniquement pour les nombres rationnels virgule flottante Virgule flottante e Un nombre réel x = ± m* b base b. est représenté par un signe, une mantisse m, un exposant e, et une Il existe une infinité de représentation du même nombre. Représentation normalisée : pour une base b, la mantisse est prise dans l'intervalle [1, b[ (zéro admet une représentation particulière). La précision et l'intervalle de valeurs représentées dépendent du nombre de bits utilisés pour coder la mantisse et l'exposant. Norme IEEE754 La norme IEEE 754 est la norme la plus utilisée pour représenter les réels. • • • • nombres codés sur 32 bits (simple précision), ou 64 bits (double précision) la mantisse appartient à l'intervalle [1,0 10,0[ (en binaire) le seul chiffre à gauche de la virgule étant toujours 1, n'est pas représenté l'exposant E est codé avec un excès de 127 (simple précision) ou 1023 (double précision) (i.e. E = e+127 ou E = e+1023) Sur 32 bits : S 1 bit (−1) S *1, M * 2 E −127 Exposant E Mantisse M 8 bits 23 bits Exemple: Coder le nombre réel 95.7 selon la norme IEEE 754 Solution: 95.7 = 1011111,101100100010001000100010001000100…B=1,01111110110010001000100 B * 26 E = 6 + 127 = 128 + 5 = 10000101B 95.7 est codé par: 0 100 0010 1 011 1111 0110 0100 0100 0100 -5 est codé par: 1 100 0000 1 010 0000 0000 0000 0000 0000 6 Vérifier! Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels Précision La représentation des nombres réels sur une machine se base sur un nombre fini de valeurs. C'est donc une représentation approchée. Précision de la représentation = différence entre les mantisses de deux nombres réels consécutifs. ! La précision ne dépend que de la mantisse. En conséquence de ces limites, il existe donc un nombre limité de nombres représentables sur machine. Remarques: 1. Le zéro : le zéro est le seul nombre qui ne peut pas se représenter dans le système en virgule flottante à cause de la contrainte de non nullité du premier digit. 2. Les exposants 00000000 et 11111111 sont interdits: • • l'exposant 00000000 signifie que le nombre est dénormalisé; l'exposant 11111111 indique que l'on n'a pas affaire à un nombre (on note cette configuration NaN, Not a Number, et on l'utilise pour signaler des erreurs de calculs, comme par exemple une division par 0). 3. Les plus petit exposant est donc -126, et le plus grand +127. 4. Dépassement de capacité : Si l'on cherche à représenter un nombre très petit, on produit un débordement par valeur inférieure (underflow). Si l'on cherche à représenter un nombre très grand, on produit un débordement par valeur supérieure (overflow). 4. Décimaux codés binaire Cette codification est utilisée souvent dans les calculatrices de poche et de bureau, Un nombre décimal, qui est composé d’un ou plusieurs chiffres (0 à 9), est toujours codé à l’aide de bits. Il existe un certain nombre de codes; voici deux. CODE DCB Décimal Codé Binaire : chaque chiffre d'un nombre est codé sur 4 bits Ce code simplifie la conversion décimal binaire. Pour l’addition, il faut ajouter 6 chaque fois que le résultat est >9. Pour la soustraction, il faut retrancher 6 chaque fois que le résultat est < 0. CODE Excédent-3 Chaque chiffre décimal est codé séparément en son équivalent binaire + 3. Exemple 4850 est codé par 0111 1011 1000 0011 Au cours d’une addition, le chiffre décimal est augmenté de 6; en lui retirant systématiquement 3, le résultat sera codé en code excédent-3. Si une addition de ce type conduit à une retenue du cinquième ordre binaire, il faudra au contraire ajouter 3 aux deux ordres décimaux pour que les chiffres correspondants se retrouvent en code excédent-3. 7 2eme année LMD Informatique Architecture des Ordinateurs CHAP I : Rappels 5. Représentation des caractères Les caractères sont des données non numériques: il n'y a pas de sens à additionner ou multiplier deux caractères. Par contre, il est souvent utile de comparer deux caractères, par exemple pour les trier dans l'ordre alphabétique. Les caractères, appelés symboles alphanumériques, incluent les lettres majuscules et minuscules, les symboles de ponctuation (& ~ , . ; # " - etc...), et les chiffres. Un texte, ou chaîne de caractères, sera représenté comme une suite de caractères. Le codage des caractères est fait par une table de correspondance indiquant la configuration binaire représentant chaque caractère. Les deux codes les plus connus sont l'EBCDIC (en voie de disparition) et le code ASCII (American Standard Code for Information Interchange). Le code ASCII représente chaque caractère sur 7 bits (on parle parfois de code ASCII étendu, utilisant 8 bits pour coder des caractères supplémentaires). Notons que le code ASCII original, défini pour les besoins de l'informatique en langue anglaise) ne permet la représentation des caractère accentués (é, è, à, ù, ...), et encore moins des caractères chinois ou arabes. Pour ces langues, d'autres codages existent, utilisant 16 bits par caractères. ASCII US défini par la norme iso-646 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 A B C D E F NUL DLE SOH DC1 STH CD2 ETH DC3 EOT DC4 ENQ NAK ACK SYN BEL ETB BS CAN HT EM LF SUB VT ESC FF FS CR GS SO RS SI US spc 0 @ P ` p ! 1 A Q a q " 2 B R b r # 3 C S c s $ 4 D T d t % 5 E U e u & 6 F V f v ‘ 7 G W g w ( 8 H X h x ) 9 I Y i y * : J Z j z + ; K [ k { , < L \ l | = M ] m } . > N ^ n ~ / ? O _ o DEL Pour bien lire le tableau, il faut construire le code hexadécimal en prenant d'abord le digit de la ligne, puis le digit de la colonne. Par exemple, la lettre "n" a pour code hexadécimal 6E Plusieurs points importants à propos du code ASCII: • • • • Les codes compris entre 0 et 31 ne représentent pas des caractères, ils ne sont pas affichables. Ces codes, souvent nommés caractères de contrôles sont utilisés pour indiquer des actions comme passer à la ligne (CR, LF), émettre un bip sonore (BEL), etc. Les lettres se suivent dans l'ordre alphabétique (codes 65 à 90 pour les majuscules, 97 à 122 pour les minuscules), ce qui simplifie les comparaisons. On passe des majuscules aux minuscules en modifiant le 5ième bit, ce qui revient à ajouter 32 au code ASCII décimal. Les chiffres sont rangés dans l'ordre croissant (codes 48 à 57), et les 4 bits de poids faibles définissent la valeur en binaire du chiffre. III. Protection contre les erreurs Intérêt d'un contrôle d'erreur Le codage binaire est très pratique pour une utilisation dans des appareils électroniques tels qu'un ordinateur, dans lesquels l'information peut être codée grâce à la présence ou non d'un signal électrique. Toutefois, le signal électrique peut subir des perturbations, notamment lors du transport des données (dans un réseau par exemple) car les données circulent sur un long trajet. Ainsi, le contrôle 8 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels de la validité des données est nécessaire pour certaines applications (professionnelles, bancaires, industrielles, confidentielles, relatives à la sécurité, ...). C'est pourquoi il existe des mécanismes permettant de garantir un certain niveau d'intégrité des données. 1. Le contrôle de parité La plupart des systèmes de contrôle d'erreur sont basés sur un ajout d'information permettant de vérifier la validité des données. Le contrôle de parité est un des systèmes de contrôle les plus simples. Il consiste à ajouter un bit supplémentaire (appelé bit de parité) à un certain nombre de bits de données (généralement 7, pour former un octet avec le bit de parité) dont la valeur (0 ou 1) . la valeur est telle que le nombre total de bit à 1 (calculé sur m+1) est pair ou impair. Si la parité n’est plus respectée, l’erreur est détectée, mais s’il y a double erreur, la parité est aussi respectée et alors l’erreur n’est plus détectée. 2. Double parité: En plus du contrôle par octet (horizontal), on ajoute une parité par bit pour un bloc d’information (parité longitudinal). Ce double contrôle permet de détecter un nombre impair d’erreur et parfois de corriger certaines erreurs. 3. Le code de Hamming: est basé sur les tests de parité pair et ne permet de corriger qu’un bit en erreur. Au m bits d’information, on ajoute k bits de contrôle. Pour que les bits de contrôle puissent coder les m+k+1 possibilités d’erreurs (dont l’absence d’erreur) ,il faut que 2k >= m+k+1. Les bits sont numérotés de 1 à m+k et Les bits de test sont placés en position 1, 2, 4, 8, . . (puissance de 2). Chaque bit est contrôlé par les bits qui additionnés donnent le numéro de ce bit. Ainsi Le bit 1 contrôle les bits 1, 3, 5, 7, 9, 11, 13, 15, 17,. . . . . Le bit 2 contrôle les bits 2, 3, 6, 7, 10, 11, 14, 15, . . . . Le bit 4 contrôle les bits 4, 5, 6, 7, 12, 13, 14, 15 . . . . . Le bit 8 contrôle les bits 8, 9, 10, 11, 12, 13, 14, 15, 24 . . . Exemple: Soit l’information composée de 8 bits m7,m6,m5, m4,m3,m2, m1,m0 Il faut donc 4 bits de contrôle k3,k2, k1,k0 . L’information avec contrôle devient m7,m6,m5, m4, k3,m3,m2, m1, k2,m0, k1,k0 Si L’information est: 10110101 Après L’ajout des bits de contrôle On obtient 1011 1 010 0 1 10 On suppose que le bit 10 est détérioré (inversé) lors d'une transmission, 10 0 1 1 010 0 1 10 . Après calcule des parités pour les bits de contrôle, on obtient 1010 9 Architecture des Ordinateurs 2eme année LMD Informatique 10 CHAP I : Rappels Architecture des Ordinateurs CHAP I 2eme année LMD Informatique CHAP I : Modèle de Von Neumann Modèle de Von Neumann Dans cette partie, nous décrivons rapidement l’architecture de base d’un ordinateur et les principes de son fonctionnement. Un ordinateur est une machine de traitement de l’information. Il est capable d’acquérir de l’information, de la stocker, de la transformer en effectuant des traitements quelconques, puis de la restituer sous une autre forme. Le mot informatique vient de la contraction des mots information et automatique. I. Modèle de Von Neumann L’architecture, dite architecture de Von Neumann, est un modèle pour un ordinateur qui utilise une structure de stockage unique pour conserver à la fois les instructions et les données requises ou générées par le calcul. De telles machines sont aussi connues sous le nom d’ordinateurs à programme stocké en mémoire. La séparation entre le stockage et le processeur est implicite dans ce modèle. C’est la première description d’un ordinateur dont le programme est stocké dans sa mémoire. 1. a) L’architecture de Von Neumann décomposait l’ordinateur en quatre parties distinctes La mémoire centrale : c'est là que sont mémorisés les informations et les programmes qui les traitent, tout au long de l'exécution. Cette mémoire est aussi appelée mémoire vive (ou RAM en anglais); elle est volatile, c'est-à-dire qu'elle perd ses informations dès qu'elle n'est plus alimentée en courant. De sa capacité dépend la capacité de l'ordinateur à exécuter efficacement de "gros programmes" sur des volumes de données importants, ou éventuellement à exécuter plusieurs programmes "en même temps" (c'est le cas quand sur un ordinateur personnel, on exécute plusieurs applications simultanément). La capacité de la mémoire centrale varie couramment de quelques Méga-octets à quelques Giga-octets. Chaque emplacement de la mémoire est numéroté par une "adresse". Cette adresse est un entier positif, indispensable pour retrouver l'endroit en mémoire où est mémorisée une information. La mémoire centrale contient aussi toujours au moins un petit peu de "mémoire morte" (ROM pour Read Only Memory), pour contenir le premier programme qui s'exécute au démarrage. Dans le cas des ordinateurs embarqués, l'ensemble des programmes peut être enregistré en ROM (ils ne sont alors plus modifiables). Dans les nouvelles architectures on trouve aussi une Mémoire Cache (mémoire tampon): mémoire rapide permettant de réduire les délais d’attente des informations stockées en mémoire vive. Structure de la MP La mémoire est divisée en emplacements de taille fixe (par exemple 8 bits) utilisés pour stocker instructions et données. En principe, la taille d'un emplacement mémoire pourrait être quelconque; en fait, la plupart des ordinateurs en service aujourd'hui utilisent des emplacements mémoire d'un octet (byte en anglais, soit 8 bits, unité pratique pour coder un caractère par exemple). 11 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann Dans une mémoire de taille N, on a N emplacements mémoires, numérotés de 0 à N-1. Chaque emplacement est repéré par son numéro, appelé adresse. L'adresse est le plus souvent écrite en hexadécimal. La capacité (taille) de la mémoire est le nombre d'emplacements, exprimé en général en kilooctets ou en méga-octets, voire davantage. Sélecteur d’adresse (décodeur) c’est un circuit à n entrées et 2n sorties. Il permet de déterminer une cellule à partir d’une adresse. Opérations sur la mémoire Seul le processeur peut modifier l'état de la mémoire. Chaque emplacement mémoire conserve les informations que le processeur y écrit jusqu'à coupure de l'alimentation électrique, où tout le contenu est perdu (contrairement au contenu des mémoires externes comme les disquettes et disques durs). Les seules opérations possibles sur la mémoire sont: • écriture d'un emplacement: le processeur donne une valeur et une adresse, et la mémoire range la valeur à l'emplacement indiqué par l'adresse; • lecture d'un emplacement: le processeur demande à la mémoire la valeur contenue à l'emplacement dont il indique l'adresse. Le contenu de l'emplacement lu reste inchangé. Unité de transfert Notons que les opérations de lecture et d'écriture portent en général sur plusieurs octets contigus en mémoire: un mot mémoire. La taille d'un mot mémoire dépend du type de processeur; elle est de • • • 1 octet (8 bits) dans les processeurs 8 bits (par exemple Motorola 6502); 2 octets dans les processeurs 16 bits (par exemple Intel 8086); 4 octets dans les processeurs 32 bits (par ex. Intel 80486 ou Motorola 68030). 12 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann b) L’unité arithmétique et logique (UAL) ou unité de traitement, Elle comporte des dispositifs électroniques capables d'effectuer des opérations logiques et arithmétiques sur les codes binaires, son rôle est d’effectuer les opérations de base, un peu comme le ferait une calculette. Elle possède les registres suivants : • • Les registres arithmétiques. Les registres de base et d’index (calcul d’adresse par rapport à une base ou index). • Les registres banalisés (ex : stockage de résultats intermédiaires). • Le registre d’état PSW (Program Status Word) (Flags : F) A chaque opération, le microprocesseur positionne un certain nombre de bits. Ces bits sont appelées aussi indicateurs d'état ou drapeaux (status, flags). Par exemple, si une soustraction donne un résultat nul, l'indicateur de zéro ( Z ) sera mis à 1. Ces indicateurs sont regroupées dans le registre d'état c) L’unité de contrôle (commande). L'unité de contrôle organise le fonctionnement interne de la machine. Elle est chargée de provoquer dans l'unité de calcul les opérations prévues par le programme, comme elle contrôle aussi l'ensemble des autres dispositifs de l'ordinateur. C’est l’équivalent des doigts qui actionneraient la calculette. L’unité de commande est constituée de plusieurs organes qui permettent la lecture en mémoire et le décodage des instructions. On trouve: • Le compteur ordinal (Instruction Pointer) (IP): ou Compteur de Programme, contient l'adresse de l'emplacement mémoire où se situe la prochaine instruction à exécuter; • Le registre d’instruction (RI): contient le code de l'instruction en cours d'exécution (lu en mémoire via le bus de données); il a le même format qu’une instruction. • Le décodeur de code opération qui détermine l’opération à effectuer parmi toutes celles possibles. • Le séquenceur est un automate générant les signaux de commandes nécessaires pour actionner et contrôler les unités participant à l’exécution d’une instruction. Il existe deux types de séquenceurs: - le séquenceur câblé qui est un circuit séquentiel complexe mais d’exécution très rapide. - le séquenceur micro programmé contenu dans une ROM qui est plus simple à utiliser et à concevoir, mais moins rapide. • L’horloge qui synchronise toutes les actions de l’unité centrale. 13 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann d) Unité d’entrées-sorties : dispositifs qui permettent de communiquer avec le monde extérieur. Dans les nouvelles architectures l’UAL et l’unité de contrôle sont regroupés en un seul dispositif « le processeur » ou microprocesseur. Un ordinateur se compose donc principalement d'un processeur (CPU), de mémoire (RAM et ROM), et de composants périphériques (Clavier, port série, contrôleur en tout genre, carte son....). Le CPU est bien sur le maître à bord dans un ordinateur (comme dans une console de jeux d'ailleurs), la mémoire et les périphériques étant à son service. Le CPU est connecté aux périphériques et à la mémoire à l'aide d'un BUS. 2. Le BUS Le BUS est une chaîne ou tous les périphériques sont connectés en parallèle. Un BUS système se divise généralement en trois sous BUS: - Le BUS de données (c'est la partie qui transporte les données brutes). Notons que plus ce bus est large plus le système sera rapide. En effet un système 16 Bits est plus rapide qu'un système 8 bits car il est capable de 'transporter' 2 octets à la fois alors que le système 8 bits n'en transporte qu'un à la fois (1 octet = 8 bits) - Le BUS d'adressage (c'est celui qui désigne un endroit dans la mémoire ou un périphérique). Plus il est large plus on peut adresser de la mémoire. Exemple: bus d'adressage 16bits =64Ko adressables, bus 32bits = 4Go!) - Le BUS de contrôle (il désigne le mode de l'opération à effectuer: Lecture ou écriture, périphérique ou Mémoire, Interruption, etc.) 3. Les registres C'est l'ensemble des emplacements facilement spécifiables qui contiennent temporairement les opérandes et les résultats des opérations ou des données comme une instruction ou une adresse. Se sont des petites mémoires internes à accès très rapides. Chaque registre stocke 8, 16,32 ou 64 bits. Le nombre exact de registres dépend du type de processeur et varie typiquement entre une dizaine et une centaine. Il n'est absolument pas nécessaire que les registres soient homogènes bien qu'on puisse souvent grouper les registres en classes, de sorte que les registres d'une classe peuvent être utilisés à la place 14 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann de n'importe quel autre registre de la même classe. Mais il n'est pas rare qu'une classe ne comporte qu'un seul registre. Les architectures ont quasiment toutes au moins deux classes de registres: une pour stocker les valeurs entières, une pour stocker les nombres représentés en virgule flottante. Mais souvent, l'espace de travail comporte des registres ayant des fonctions particulières. Un accumulateur : est un registre servant de source implicite à la plupart des instructions et contenant le résultat après leur exécution. Les registres d'index : sont des registres servant au calcul d'adresse. Un pointeur de pile : indiquant l'adresse du sommet d'une pile gérée par le processeur. Un frame pointer : servant à accéder aux données locales de la routine en cours d'exécution. Certains registres ont un comportement particulier: ils informent de l'état du processeur ou contiennent des informations à propos des dernières opérations effectuées (par exemple un indicateur indiquant si le dernier résultat était nul ou pas). Parmi ces registres particuliers on trouve souvent: Le compteur ordinal (program counter, instruction pointer) : indiquant l'adresse de l'instruction en cours d'exécution ou de la prochaine instruction à exécuter; le mot d'état : regroupant les informations les plus importantes sur l'état du processeur. 4. Notion de programme Un programme est une suite d'instructions élémentaires, qui vont être exécutées dans l'ordre par le processeur. Ces instructions correspondent à des actions très simples, comme additionner deux nombres, lire ou écrire une case mémoire, etc. Chaque instruction est codifiée en mémoire sur quelques octets. Le processeur est capable d'exécuter des programmes en langage machine, c'est à dire composés d'instructions très élémentaires suivant un codage précis. Chaque type de processeur est capable d'exécuter un certain ensemble d'instructions, son jeu d'instructions. Pour écrire un programme en langage machine, il faut donc connaître les détails du fonctionnement du processeur qui va être utilisé. 5. Exécution d'une instruction Les différentes phases d'une exécution On peut suivre les différentes phases de l'exécution d'une instruction. Celles-ci sont au nombre de 3 : Recherche de l'instruction (Fetch), Décodage (décode), Exécution (exécute) Recherche de l'instruction Le contenu de PC (compteur ordinal) est placé sur le bus des adresses (c'est l'unité de commande qui établit la connexion). L'unité de commande positionne le compteur ordinal (PC) pour l'instruction suivante. L'unité de commande (UC) émet un ordre de lecture (READ=RD=1) Au bout d'un certain temps (temps d'accès à la mémoire) le contenu de la case mémoire sélectionné est disponible sur le bus des données. L'unité de commande charge la donnée dans le registre d'instruction pour décodage. 15 Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann Décodage Le registre d'instruction contient maintenant le premier mot de l'instruction qui peut être codée sur plusieurs mots. Ce premier mot contient le code opération qui définit la nature de l'opération à effectuer (addition, rotation,...) et le nombre de mots de l'instruction. L'unité de commande décode le code opération et peut alors exécuter l'instruction. L'exécution Le micro-programme réalisant l'instruction est exécuté. Les indicateurs sont positionnés (registre d'état). Stockage des résultats à leurs destinations respectives. Retour à l'étape 1 pour exécuter l'instruction suivante. Lecture de l’instruction (Incrémentation de PC Décodage de l’instruction Calcul de l’adresse des opérandes Lecture des opérandes Opération Rangement du résultat Positionnement des indicateurs 16 Architecture des Ordinateurs CHAP II 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Microprocesseur MIPS R3000 Architecture externe 1. Introduction MIPS (de l'anglais Microprocessor without interlocked pipeline stages) est une architecture de microprocesseur de type RISC. Elle fut développée par la compagnie MIPS Computer Systems Inc., basée à Mountain View en Californie. Les processeurs fabriqués selon cette architecture sont utilisés dans plusieurs systèmes. On les retrouve dans plusieurs systèmes embarqués (embedded systems en anglais), comme les ordinateurs de poche, les routeurs Cisco et les consoles de jeux vidéo (Nintendo 64 et Sony PlayStation, PlayStation 2 et PSP). Vers la fin des années 1990, on estimait que les processeurs dérivés de l'architecture MIPS occupaient le tiers des processeurs RISC produits. Les premières implémentations de l'architecture MIPS étaient de 32 bits (autant au niveau des registres que des chemins de données), mais par la suite, on a développé des implémentations de 64 bits. Il existe plusieurs jeux d'instructions MIPS qui sont rétro compatibles (backward compatible): MIPS I, MIPS II, MIPS III, MIPS IV, et MIPS V ainsi que MIPS32 et MIPS64. MIPS32 et MIPS64, qui se basent sur MIPS II et MIPS V, ont étés introduites comme jeux d'instructions normalisés. Des extensions sont aussi disponibles telles que : MIPS-3D, une unité à virgule flottante (FPU) simplifiée de type SIMD pour les calculs 3D de base, Les jeux d'instructions de base (en particulier MIPS I) sont si simples et efficaces qu'un bon nombre de cours d'architecture des ordinateurs, autant dans les universités que les écoles techniques, se portent sur l'étude de l'architecture MIPS. Ce cours présente une version simplifiée de l'architecture externe du processeur MIPS R3000. L'architecture externe représente ce que doit connaitre un programmeur souhaitant programmer en assembleur, ou la personne souhaitant écrire un compilateur pour ce processeur: 2. Caractéristiques L'architecture externe est l'interface entre le processeur et le programmeur. Ce cours sera plus orienté vers l'architecture interne. Une architecture externe est composée de : - Les registres visibles. - L'adressage de la mémoire. - Le jeu d'instructions. - Les mécanismes de traitement des interruptions et exceptions. 2.1. Organisation de la mémoire Dans l’architecture MIPS R3000, l’espace adressable est divisé en deux segments: le segment utilisateur, et le segment système (noyau). Un programme utilisateur utilise généralement trois sous-segments (appelés sections) dans le segment utilisateur: 1. la section text contient le code exécutable en mode utilisateur. Elle est implantée conventionnellement à l’adresse 0x00400000. Sa taille est fixe et calculée lors de l’assemblage. La principale tâche de l’assembleur consiste à générer le code binaire correspondant au programme source décrit en langage d’assemblage, qui sera chargé en mémoire dans cette section. 17 Architecture des Ordinateurs 2eme année LMD Informatique 2. la section data contient les données globales manipul.es par le programme utilisateur. Elle est implantée conventionnellement à l’adresse 0x10000000. Sa taille est fixe et calculée lors de l’assemblage. Les valeurs contenues dans cette section peuvent être initialisées grâce à des directives contenues dans le programme source en langage d’assemblage. 3. la section stack contient la pile d’exécution du programme utilisateur. Sa taille varie au cours de l’exécution. Elle est implantée conventionnellement à l’adresse 0x7FFFF000. La pile s’étend vers les adresses décroissantes. CHAP II : Microprocesseur MIPS R3000 0xFFFFFFFF Réservé 0xFFFFF000 0xFFFFEFFF .kstack Segment Système (noyau) .kdata 0xC0000000 0xBFFFFFFF .ktext 0x80000000 0x7FFFFFFF Réservé 0x7FFFF000 0x7FFFEFFF .stack Trois sections sont également définies dans le segment noyau (kernel): Segment 1. la section ktext contient le code exécu.data utilisateur 0x10000000 table en mode noyau. Elle est implantée 0x0FFFFFFF conventionnellement à l’adresse .text 0x80000000. Sa taille est fixe et calculée 0x00400000 lors de l’assemblage. 0x003FFFFF 2. la section kdata contient les données gloRéservé bales manipulées par le système 0x00000000 d’exploitation en mode noyau. Elle est implantée conventionnellement à l’adresse 0xC0000000. Sa taille est fixe et calculée lors de l’assemblage. 3. la section kstack contient la pile d’exécution du noyau. Sa taille varie au cours de l’exécution. Elle est implantée conventionnellement. l’adresse 0xFFFFF000. Cette pile s’étend vers les adresses décroissantes. Question : Calculer l’espace de chaque section de la mémoire 2.2. Registres visibles du logiciel Le processeur MIPS possède 32 registres de travail accessibles au programmeur. Chaque registre est connu par son numéro, qui varie entre 0 et 31, et est préfixé par un $. Par exemple, le registre 31 sera noté $ra dans l’assembleur. En dehors du registre $zero qui contient toujours la valeur 0, tous les registres sont identiques du point de vue de la machine. Ils sont directement adressés par les instructions, et permettent de stocker des résultats de calculs intermédiaires. Afin de normaliser et de simplifier l’écriture du logiciel, des conventions d’utilisation des registres sont définies. Ces conventions sont particulièrement nécessaires lors des appels de fonctions. 18 Architecture des Ordinateurs Registres $0 $1 $2 $3 Nom $zero $at $v0 $v1 $4,$5,$6,$7 $a0 … $a3 $8, … , $15 $16, … , $23 $24, $25 $26, $27 $28 $29 $30 $31 $t0 … $t7 $s0 … $s7 $t8, $t9 $k0, $k1 $gp $sp $s8 $ra HI LO PC 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Description vaut zéro en lecture, non modifié par écriture Réservé à l’assembleur pour les macros. Ne doit pas être utilisé Utilisé pour les valeurs de retour des fonctions Utilisé. pour les appels systèmes. Contient le numéro d'appel de la fonction système syscall. Utilisés par le compilateur pour optimiser les appels de fonctions pour contenir les arguments Registres de travail utilisable par le code utilisateur Registres de sauvegardes d'usage universel Registres de travail utilisable par le code utilisateur Réservés aux procédures noyau. Pointeur global. Constant pour tout processus . Pointeur de pile Pointeur sur la zone des variables globales (section data) Contient l’adresse de retour d’une fonction Registres spéciaux Poids fort du résultat d’une multiplication sur 64 bits ou reste de division. Poids faible du résultat d’une multiplication sur 64 bits ou quotient de division. Registre compteur de programme (Program Counter). • PC Registre compteur de programme (Program Counter). Ce registre contient l'adresse de l’instruction en cours d’exécution. Sa valeur est modifiée par toutes les instructions. • HI et LO Registres pour la multiplication ou la division Ces deux registres 32 bits sont utilisés pour stocker le résultat d'une multiplication ou d'une division, qui est un mot de 64 bits. 2.3. Registres protégés L’architecture MIPS définit 32 registres (numérotés de 0 à 31), qui ne sont accessibles, en lecture comme en écriture, que par les instructions privilégiées (c’est à dire les instructions qui ne peuvent être exécutées qu’en mode superviseur). On dit qu’ils appartiennent au "coprocesseur système". En pratique, cette version du processeur MIPS R3000 en utilise 4 pour la gestion des interruptions et des exceptions. SR: Registre d’état (Status Register). Il contient en particulier le bit qui définit le mode : superviseur ou utilisateur, ainsi que les bits de masquage des interruptions. (Ce registre possède le numéro 12) CR : Registre de cause (Cause Register). En cas d’interruption ou d’exception, son contenu définit la cause pour laquelle on fait appel au programme de traitement des interruptions et des exceptions. (Ce registre possède le numéro 13). EPC : Registre d’exception (Exception Program Counter). Il contient l’adresse de retour (PC+4) en cas d’interruption. Il contient l’adresse de l’instruction fautive en cas d’exception (PC). (Ce registre possède le numéro 14) 19 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 BAR : Registre d’adresse illégale (Bad Address Register). En cas d’exception de type "adresse illégale", il contient la valeur de l’adresse mal formée. (Ce registre possède le numéro 8) Les arguments La plupart des instructions nécessitent un ou plusieurs arguments. Si une instruction nécessite plusieurs arguments, ces arguments sont séparés par des virgules. Dans une instruction assembleur, on aura en général comme premier argument le registre dans lequel est mis le résultat de l’opération, puis ensuite le premier registre source, puis enfin le second registre source ou une constante. Exemple 1: add # équivalent à $v1 ← $v0 + $at $v1, $v0, $at Règle syntaxique On définit ci-dessous les principales règles d’écriture d'un programme source. Les noms de fichiers Les noms des fichiers contenant un programme source en langage d’assemblage doivent être suffixé par « .s ». Exemple: monprogramme.s Les commentaires Ils commencent par un # et s’achèvent à la fin de la ligne courante. Exemple 2: ############################################### # Source Assembleur MIPS de la fonction memcpy # ############################################### lw $t2, 0($t3) # sauve la valeur copiée dans la mémoire Les entiers Une valeur entière décimale est notée 250 (sans préfixe), et une valeur entière hexadécimale est notée 0xFA (préfixée par zéro suivi de x). En hexadécimal, les lettres de A à F peuvent être écrites en majuscule ou en minuscule. Les chaînes de caractères Elles sont simplement entre guillemets, et peuvent contenir les caractères d’échappement du langage C. Exemple : "Oh la jolie chaîne avec retour à la ligne\n". Les labels Ce sont des mnémoniques correspondant à des adresses en mémoire. Ces adresses peuvent être soit des adresses de variables stockées en mémoire (principalement dans la section data), soit des adresses de sauts (principalement dans la section text). Ce sont des chaînes de caractères qui doivent commencer par une lettre, un caractère « _ », ou un caractère « . ». Lors de la déclaration, ils doivent être suffixés par le caractère « : ». Pour y référer, on supprime le « : ». Exemple 3: message: .data .asciiz "Ceci est une chaîne de caractères...\n" .text 20 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 _start: lui ori ori $a0, message >> 16 $a0, $a0, message & 0xFFFF $v0, $zero, 4 # adresse de la chaîne dans $a0 # code de l’appel système dans $v0 L'adressage mémoire Le MIPS ne possède qu’un unique mode d’adressage pour lire ou écrire des données en mémoire: l’adressage indirect registre avec déplacement. L’adresse est obtenue en additionnant le déplacement (positif ou négatif) au contenu du registre. Exemple 4: lw sw $t4, 13($t2) $s4, -60($s6) # $t4 ← Mem[$t2 + 13] # Mem[$s6 - 60] ← $s4 S’il n’y a pas d’entier devant la parenthèse ouvrante, le déplacement est nul. Pour ce qui concerne les sauts, il faut nécessairement utiliser des labels. Quelques notations: Mem[ad] : Contenu de la mémoire d’adresse ad || : Concaténation entre deux chaînes de bits Bn : Réplication du bit B n fois dans une chaîne de bits X p..q : Sélection des bits p à q dans une chaîne de bits X 3. Jeu d’instructions Le jeu d’instructions est "orienté registres". Cela signifie que les instructions arithmétiques et logiques prennent leurs opérandes dans des registres et rangent le résultat dans un registre. Les seules instructions permettant de lire ou d’écrire des données en mémoire effectuent un simple transfert entre un registre général et la mémoire, sans aucun traitement arithmétique ou logique. La plupart des instructions arithmétiques et logiques se présentent sous les 2 formes registre-registre et registre-immédiat: Add Addition registre registre signée Syntaxe: add $rr, $ri, $rj Description : Les contenus des registres $ri et $rj sont ajoutés pour former un résultat sur 32 bits qui est placé dans le registre $rr rr ← ri + rj Exception: génération d’une exception si dépassement de capacité. Sub Soustraction registre registre signée Syntaxe: sub $rr, $ri, $rj Description : Le contenu du registre $rj est soustrait du contenu du registre $ri pour former un résultat sur 32 bits qui est placé dans le registre $rr. rr ← ri - rj Exception: génération d’une exception si dépassement de capacité. Addi Addition registre immédiat signée Syntaxe : addi $rr, $ri, imm Description : La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre $ri pour former un résultat sur 32 bits qui est placé dans le registre $rr. 21 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 rr ← (imm 15 16 || imm 15..0 ) + ri Exception: Addu Addition registre registre non-signée Syntaxe : addu $rr, $ri, $rj Description : rr ← ri + rj Exception: Addiu pas d’exception Addition registre immédiat non-signée Syntaxe : addiu $rr, $ri, imm rr ← (imm 15 16 || imm 15..0 ) + ri Exception: Subu génération d’une exception si dépassement de capacité. pas d’exception Soustraction registre registre non-signée Syntaxe : subu $rr, $ri, $rj Description : Le contenu du registre $rj est soustrait du contenu du registre $ri former un résultat sur 32 bits qui est placé dans le registre $rr. rr ← ri - rj Exception: pour pas d’exception Exemple 5: Donner l’instruction ou la suite des instructions MIPS pour effectuer les actions suivantes a) Mettre à zéro le registre R8 Add $t0, $zero,$zero b) Mettre 8000H dans le registre R9 Addi $t1, $zero, 0x8000 c) Mettre 7000H dans le registre R10 Addiu $t2, $zero, 0x7000 Exemple 5: Programmez en assembleur MIPS la fonction F(X,Y,Z) = X + 2Y -3Z . On suppose que la variable X se trouve dans le registre $t10, la variable Y dans $t1, la variable Z dans $t2 et que le résultat de la fonction F(X,Y,Z) se trouve dans le registre $t4. Add $t4, $t10, $t1 # F ← X+Y Add $t4, $t4, $t1 # F ← F +Y (i.e. X + 2Y) Sub $t4, $t4, $t2 # F ← F - Z (i.e. X + 2Y - Z) Sub $t4, $t4, $t2 # F ← F - Z (i.e. X + 2Y - 2Z) Sub $t4, $t4, $t2 # F ← F - Z (i.e. X + 2Y - 3Z) Lw Lecture d’un mot de la mémoire Syntaxe : lw $rr, imm($ri) Description : L’adresse de lecture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. l’adresse doit être multiple de 4. Le mot de 32 bits lu à cette adresse est placé dans le registre $rr. rr ← Mem[imm + ri] Exceptions: Adresse non alignée sur une frontière de mot. 22 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Sw écriture d’un mot en mémoire Syntaxe : sw $rj, imm($ri) Description : L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. l’adresse doit être multiple de 4. Le contenu du registre $rj est écrit en mémoire . Mem[imm + ri] ← rj Exceptions : - Adresse non alignée sur une frontière de mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini Lui Chargement d’une constante dans les poids forts d’un registre Syntaxe : lui $rr, imm Description : La constante immédiate de 16 bits est décalée de 16 bits à gauche, et est complétée de zéro à droite. La valeur sur 32 bits ainsi obtenue est placée dans le registre $rr. rr ← imm 15.. 0 || 016 Exception: pas d’exception Lh Lecture d’un demi-mot signé en mémoire Syntaxe : lh $rr, imm($ri) Description : L’adresse de lecture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. l’adresse doit être multiple de 2. Le demi-mot de 16 bits lu à cette adresse subit une extension de signe et est placé dans le registre $rr. rr ← (Mem[imm + ri]) 15 16 || (Mem[imm + ri]) 15..0 Exceptions: - Adresse non alignée sur une frontière de demi-mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini. Lhu Lecture d’un demi-mot non-signé en mémoire Syntaxe : lhu $rr, imm($ri) Description : L’adresse de lecture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. l’adresse doit être multiple de 2. Le demi-mot de 16 bits lu . cette adresse subit une extension avec des zéro et est placé dans le registre $rr. rr ← 016 || (Mem[imm + ri]) 15..0 Exceptions: - Adresse non alignée sur une frontière de demi-mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini Lb Lecture d’un octet signé en mémoire Syntaxe : lb $rr, imm($ri) Description : L’adresse de lecture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. L’octet lu . cette adresse subit une extension de signe et est placé dans le registre $rr. rr ← (Mem[imm + ri]) 7 24 || (Mem[imm + ri]) 7..0 23 Architecture des Ordinateurs Exceptions: 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini Lbu Lecture d’un octet non-signé en mémoire Syntaxe : lbu $rr, imm($ri) Description : L’adresse de lecture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. L’octet lu . cette adresse subit une extension avec des zéros et est placé dans le registre $rr. rr ← 024 || (Mem[imm + ri]) 7..0 Exceptions : - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini. Sh Ecriture d’un demi-mot en mémoire Syntaxe : sh $rj, imm($ri) Description : L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. l’adresse doit être multiple de 2. Les deux octets de poids faible du registre $rj sont écrits à l’adresse ainsi calculée. Mem[imm + ri] ← rj 15..0 Exceptions: - Adresse non alignée sur une frontière de demi-mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini. Sb Ecriture d’un octet en mémoire Syntaxe : sb $rj, imm($ri) Description : L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. L’octet de poids faible du registre $rj est écrit à l’adresse ainsi calculée. Mem[imm + ri] ← rj 7..0 Exceptions: - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant à un segment non défini. And ET bit-à-bit registre registre Syntaxe : and $rr, $ri, $rj Description : Un ET bit-à-bit est effectué entre les contenus des registres Le résultat est placé dans le registre $rr. rr ← ri and rj Exception : pas d’exception Andi $ri et $rj. ET bit-à-bit registre immédiat Syntaxe : andi $rr, $ri, imm Description : La valeur immédiate sur 16 bits subit une extension de zéros. Un ET bit-à-bit est effectué entre cette valeur. tendue et le contenu du registre $ri pour former un résultat placé dans le registre $rr. rr ← (016 || imm 15..0 ) and ri Exception: pas d’exception 24 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Idem pour : Or , Ori , Xor, Xori , Nor La Chargement d’une adresse dans un registre (c’est une Macro instruction! ) Syntaxe : la $rr, adr Description : L’adresse considérée comme une quantité non-signée est chargée dans le registre $rr. rr ← adr code équivalent: lui $rr, adr >> 16 ori $rr, $rr, adr & 0xFFFF Exemple 6: une séquence assembleur MIPS pour calculer la lw la lw add la sw Mult Multu Div Divu Mfhi $t10, w $s0, 0($t10) $t1, y $s1, 0($t1) $s2, $s0, $s1 $t2, z $s2, 0($t2) # # # # # # # z = w + y; put address of w into $t10 put contents of w into $s0 put address of y into $t1 put contents of y into $s1 add w + y, put result in $s2 put address of z into $t2 put contents of $s2 into z Multiplication signée Syntaxe : mult $ri, $rj Description : Le contenu du registre $ri est multiplié par le contenu du registre $rj, le contenu des deux registres étant considéré comme des nombres en complément à deux. Les 32 bits de poids fort du résultat sont placés dans le registre hi, et les 32 bits de poids faible dans lo. et hi ← (ri x rj) 63..32 lo ← (ri x rj) 31..0 Exception: pas d’exception. Multiplication non-signée Division entière signée Syntaxe : div $ri, $rj Description : Le contenu du registre $ri est divisé par le contenu du registre $rj, le contenu des deux registres étant considéré comme des nombres en complément à deux. Le quotient de la division est placé dans le registre spécial lo, et le reste dans le registre spécial hi. lo ← ri div rj et hi ← ri mod rj Exception : division par 0 Division entière non-signée Move From HI Syntaxe : mfhi $ri # 25 $ri ← hi 2eme année LMD Informatique Architecture des Ordinateurs Mflo Mthi Mtlo CHAP II : Microprocesseur MIPS R3000 Move From LO Syntaxe : mflo $ri # $ri ← lo Move to HI Syntaxe : mfti $ri # hi ← $ri Move to LO Syntaxe : mtlo $ri # lo ← $ri Organisation d’un programme en assembleur Un programme en assembleur contient obligatoirement une zone d’instructions dont le début est La première instruction à exécuter (point d’entrée du programme) repéré par la directive .text. doit être repérée avec l’étiquette __start: (avec deux underscores). .text .... .... __start: .... .... Si le programme nécessite une zone de données en mémoire, le début de cette zone est repéré par la D’autres directives sont disponibles pour déclarer et initialiser des variables. directive .data. L’ordre des zones instructions et données n’a pas d’importance. Exemple 7: Un programme qui calcule S = a + b a: b: s: .data .word .word .word .text __start: la lw la lw add la sw ori syscall (32 bits) # début de la section données en mémoire 15 20 0 # début de la section instructions (code) en mémoire $a1, a $t10, 0($a1) $a1, b $t1, 0($a1) $t4 , $t10 , $t1 $a1, s $t4 , 0($a1) # première instruction du programme # $t10 a # $t1 b # $t4 a + b # s $t4 $v0, $zero, 10 # appel système N°10 # pour terminer le programme (exit (0)) Exemple 8: Un programme qui calcule S = a* x2 + b * x + c (32 bits) S = (a*x + b)*x + c a: b: c: .data .word .word .word # début de la section données en mémoire 15 20 30 26 2eme année LMD Informatique Architecture des Ordinateurs x: s: .word .word .text __start: la lw la lw la lw la lw CHAP II : Microprocesseur MIPS R3000 40 0 # début de la section instructions (code) en mémoire $a1, x $t10, 0($a1) $a1, a $t1, 0($a1) $a1, b $t2, 0($a1) $a1, c $t3, 0($a1) mult mflo add mult mflo add la sw $t1 ,$t10 $t4 $t4 , $t4 , $t2 $t4 , $t10 $t4 $t4 , $t4 , $t3 $a1, s $t4 , 0($a1) ori $v0, $zero, 10 # première instruction du programme # $t10 x # $t1 a # $t2 b # $t3 c # $t4 a* x # $t4 a* x + b # $t4 (a* x + b)* x # $t4 (a *x + b) *x + c # s $t4 # appel système N°10 pour terminer le programme (exit (0)) syscall Exemple 9: Ecrire un programme qui calcule S = a2 + b2 + c2 (32 bits) Instructions de branchements: Beq Branchement si registre égal registre Syntaxe : beq $ri, $rj, label Description : Les contenus des registres $ri et $rj sont comparés. S’ils sont égaux, le programme saute à l’adresse associée à l’étiquette par l’assembleur. if (ri = rj) pc ← adresse associée à label Exception: pas d’exception Bne Branchement si registre différent de registre Syntaxe : bne $ri, $rj, label Description: If (ri < > rj ) pc ← adresse associée à label Bgez Branchement si registre supérieur ou égal à zéro Syntaxe : bgez $ri, label Description : Si le contenu du registre $ri est supérieur ou égal à zéro, le programme saute à l’adresse associée à l’étiquette par l’assembleur. if (ri >= 0) pc <= adresse associée à label Bgtz Branchement si registre strictement supérieur à zéro 27 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Blez Branchement si registre inférieur ou égal à zéro Bltz Branchement si registre strictement inférieur à zéro J Jr Saut inconditionnel immédiat Syntaxe : j label Description : Le programme saute inconditionnellement . l’adresse associée à l’étiquette par l’assembleur. pc ← adresse associée à label Branchement inconditionnel registre Syntaxe : jr $ri Description: Le programme saute à l’adresse contenue dans le registre $ri ( souvent $ra). pc ← ri Exemple 10: Un programme qui calcule la valeur absolue d’un nombre. Programme C void main() { int x = -5; int val_abs; val_ abs = x; if (x <= 0) val_abs = -x; exit(0); } Programme assembleur x: val_abs : .data .word .word .text -5 0 __start : la lw bgtz sub $a0, x $a0, 0($a0) $a0, suite $a0, $zero, $a0 suite : la $a1, val_abs sw $a0, 0($a1) ori $v0, $zero, 10 syscall Exemple 11: Un autre programme. Programme C void main() { int x = -5; int val_abs; if (x <= 0) val_abs = -x; else val_abs = x; exit(0); } Programme assembleur x: val_abs : .data .word .word .text -5 0 __start : la lw bgtz sub j $a0, x $a0, 0($a0) $a0, vrai $a0, $zero, $a0 suite add $a0, $a0, $zero vrai : suite : la $a1, val_abs sw $a0, 0($a1) ori $v0, $zero, 10 syscall 28 2eme année LMD Informatique Architecture des Ordinateurs Exemple 12: CHAP II : Microprocesseur MIPS R3000 coder strlen (fonction longueur d’une chaîne) en assembleur . Données : - $a1 : pointeur sur la chaine - $v1 : compteur - $v0 : valeur de retour Programme C Programme assembleur strlen: int strlen(char *s ) { int i = 0; while (*s != 0) { i ++ ; s ++ ; } return( i ) ; } addi $v1, $zero, 0 # $v1 = 0 lb beq addi addi J $a2, 0 ($a1) $a2, $zero, end $v1, $v1, 1 $a1, $a1, 1 loop # $v1 = $v1 + 1 add Jr $v0, $v1, $zero $ra loop: end: # Retour Fonction Exemple 13: un programme qui passe une chaîne de caractères en majuscules. On utilise un ET logique pour masquer le bit 5 du caractère et le passer en majuscule (voir le code ASCII). Données : - $a1 : pointeur sur la chaine Programme C char *maj(char *s ) { char *c ; c=s; while (*s != ‘\0’) { *s = *s & 0xDF; s++ ; } return(c) ; Programme assembleur maj: addi $v1, $a1, 0 lb beq andi sb addi J $a2, 0 ($v1) $a2, $zero, end $a2, $a2, 0xDF $a2, 0($v1) $v1, $v1, 1 loop Jr $ra # $v1 = $a1 loop: # $a2 = $a2 and 11011111b end: } # Retour Fonction Exemple 14: Calcul PGCD(a, b) pgcd(0, b) pgcd(a, b) = b = pgcd(|a-b|, min(a,b) ) si a = 0 (pour a # b) pgcd( 105, 75)= pgcd( 30, 75) = pgcd( 30, 45) = pgcd( 30, 15) = pgcd( 15, 15) = pgcd( 0, 15) =15 Données : - $a0 : valeur de a - $a1 : valeur de b - $v1 : valeur de retour 29 Architecture des Ordinateurs 2eme année LMD Informatique Programme C int pgcd(int a, int b ) { while (a) if (a < b) b = b-a; else a = a-b; return( b) ; } CHAP II : Microprocesseur MIPS R3000 Programme assembleur pgcd : while : beq sub bgez sub j else : sub endif : j endwhile : add Jr $a0, $zero, endwihe $t10, $a0 , $a1 $t10, else $a1, $a1 , $a0 endif $a0, $a0 , $a1 while $v0,$a1, 0 $ra # Retour Fonction Instructions de décalages: Sll Décalage à gauche immédiat Syntaxe : sll $rr, $ri, imm Description : Le registre est décalé à gauche de la valeur immédiate codée sur 5 bits, des zéros étant introduits dans les bits de poids faibles. Le résultat est placé dans le registre $rr. rr ← ri (31 - imm)..0 || 0imm Exception: pas d’exception. Srl Décalage à droite logique immédiat Syntaxe : srl $rr, $ri, imm Description : Le registre est décalé à droite de la valeur immédiate codée sur 5 bits, des zéros étant introduits dans les bits de poids fort. rr ← 0imm || ri 31..imm Exception: pas d’exception. Sllv Décalage à gauche registre Syntaxe : sllv $rr, $ri, $rj Description : Le registre $ri est décalé à gauche du nombre de bits spécifiés dans les 5 bits de poids faible du registre $rj, des zéros étant introduits dans les bits de poids faibles. Le résultat est placé dans le registre $rr. rr ← ri (31 - rj)..0 || 0rj Exception: pas d’exception. Srlv Décalage à droite logique registre Syntaxe : srlv $rr, $ri, $rj Description : Le registre $ri est décalé à droite du nombre de bits spécifié dans les 5 bits de poids faible du registre $rj des zéros étant introduits dans les bits de poids fort ainsi libérés. Le résultat est placé dans le registre $rr . rr ← 0 rj || ri 31.. rj 30 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Sra Décalage à droite arithmétique immédiat Syntaxe : sra $rr, $ri, imm Description : Le registre $ri est décalé à droite de la valeur immédiate codée sur 5 bits, le bit de signe du registre $ri étant introduit dans les bits de poids fort. Le résultat est placé dans le registre . rr ← (ri 31 ) imm || (ri) 31..imm Srav Décalage à droite arithmétique registre Syntaxe : srav $rr, $ri, $rj Description : Le registre $ri est décalé à droite du nombre de bits spécifié dans les 5 bits de poids faible du registre $rj, le bit de signe de $ri étant introduit dans les bits de poids fort. Le résultat est placé dans le registre $rr. rr ← (ri 31 ) rj || (ri) 31..rj Exemple 15: Calculer le nombre de 1 dans un mots de 32 bits Données : - $a1 : valeur du mot - $a0 : valeur de retour Programme C Programme assembleur int nb_un(long int a) { int i = 0 ; unsigned long int masque = 0x80000000; do { if (a & masque) i++ ; masque = masque >> 1 ; } while (masque != 0) ; return( i ) ; nb_un : ori ori do : and beq addi finsi: srl bne Jr $a0, $zero, 0 $a2, $zero, 0x80000000 $a3, $a1, $a2 $a3, $zero, finsi $a0, $a0,1 $a2, $a2, 1 $a2, $zero , do $ra # Retour Fonction } Syscall Appel à une fonction du système (en mode noyau). Syntaxe syscall Description Un appel système est effectué, transférant immédiatement, et inconditionnellement le contrôle au gestionnaire d’exception. Note : par convention, le numéro de l’appel système, c.-à-d. le code de la fonction système à effectuer, est placé dans le registre $v0. Pc ← 0x80000080 Exception Déclenchement d’une exception de type appel système. 31 2eme année LMD Informatique Architecture des Ordinateurs CHAP II : Microprocesseur MIPS R3000 Break Arrêt et saut à la routine d’exception Syntaxe break imm Description Un point d’arrêt est détecté, et le programme saute à l’adresse de la routine de gestion des exceptions. Pc ← 0x80000080 Exception Déclenchement d’une exception de type point d’arrêt. Appels système Pour exécuter certaines fonctions système, typiquement les entrées/sorties (lire ou écrire un nombre, ou un caractère), il faut utiliser des appels système. Par convention, le numéro de l’appel système est contenu dans le registre $v0, et son unique argument dans le registre $a0. Cinq appels système sont actuellement supportés dans l’environnement de simulation : écrire un entier : Il faut mettre l’entier à écrire dans le registre $a0 et exécuter l’appel système numéro 1. Typiquement, on aura : ori $a0, 123 ori $v0, $zero, 1 syscall # met 123 dans l’argument # code de ’print_int’ # affiche 123 lire un entier : La valeur de retour d’une fonction — système ou autre — est positionnée dans le registre $v0. Ainsi, lire un entier consiste à exécuter l’appel système numéro 5 et récupérer le résultat dans le registre $v0. ori $v0, $zero, 5 syscall # code de ’read_integer’ # $v0 contient ce qui a été lu écrire une chaîne de caractères : Une chaîne de caractères étant identifiée par un pointeur, il faut passer ce pointeur à l’appel système numéro 4 pour l’afficher. str: .asciiz "Chaîne à afficher\n" … la ori syscall $a0, str $v0, $zero, 4 # charge le pointeur dans $a0 # code de ’print_string’ # affiche la chaine pointée lire une chaîne de caractères : Pour lire une chaîne de caractères, il faut un pointeur et une longueur maximum. Il faut passer ce pointeur, dans $a0, et cette longueur, dans $a1, et exécuter l’appel système numéro 8. Le résultat sera mis dans l’espace pointé. 32 2eme année LMD Informatique Architecture des Ordinateurs read_str: .space la ori ori syscall 256 $a0, read_str $a1, $zero, 255 $v0, $zero, 8 # # # # CHAP II : Microprocesseur MIPS R3000 charge le pointeur dans $a0 charge longueur max dans $a1 code de ’read_string’ lit la chaîne quitter : L’appel système numéro 10 effectue l’exit du programme au sens du langage C. ori syscall $v0, $zero, 10 # indique l’appel à exit # quitte pour de bon! Exemple 16: Programme C main() { s1 : s2 : int n ; printf("Donner un entier\n"); Programme assembleur .data .asciiz "Donner un entier\n" .asciiz "L’entier est " .text main : la ori syscall ori syscall add la ori syscall add ori syscall ori syscall scanf("%d", &n); printf("L’entier est %d\n", n); exit(0); } 33 $a0, s1 $v0, $zero, 4 $v0, $zero, 5 $a1, $v0, $zero $a0, s2 $v0, $zero, 4 $a0, $a1, $zero $v0, $zero, 1 $v0, $zero, 10 Architecture des Ordinateurs Catégorie Arithmétique 2eme année LMD Informatique Instruction Signification add soustraction sub $1,$2,$3 $1 = $2 - $3 addition immédiate addi $1,$2,100 $1 = $2 + 100 Addition non signée addu $1,$2,$3 $1 = $2 + $3 Soustraction non signée subu add immédiat non signée addiu $1,$2,100 $1 = $2 + 100 Multiply signed Mult LO = ($1 *$2) 31..0 HI =($1 *$2) 63..32 Multiply unsigned Multu $1,$2,$3 $1,$2,$3 $1 , $2 $1 , $2 $1 = $2 + $3 $1 = $2 - $3 LO = ($1 *$2) 31..0 HI =($1 *$2) 63..32 Divide signed Div Divide unsigned Divu $1 , $2 L0 = Quotient , HI = reste Move from coprocessor register mfc0 $1,$epc $1 = $epc and and $1,$2,$3 $1 = $2 & $3 and immediate $1 , $2 L0 = Quotient , HI = reste or $1,$2,$3 $1 = $2 | $3 andi $1,$2,100 $1 = $2 & 100 or immediate ori $1,$2,100 $1 = $2 | 100 xor xor $1,$2,$3 $1 = $2 ⊕ $3 xor immediate nor Décalages Exemple addition or Logique CHAP II : Microprocesseur MIPS R3000 xori $1,$2,100 $1 = $2 ⊕ 100 nor $1,$2,$3 $1 = $2 nor $3 shift left logical variable sllv $1, $2, $3 $1 = $2 << $3 shift right logical variable srlv $1, $2, $3 $1 = $2 >> $3 shift right arithmetical variable srav $1, $2, $3 $1 = $2 >>* $3 shift left logical sll $1,$2,10 $1 = $2 << 10 shift right logical srl $1,$2,10 $1 = $2 >> 10 shift right arithmetical sra 34 $1, $2, 10 $1 = $2 >>* 10 Architecture des Ordinateurs 2eme année LMD Informatique load word lw $1,(100)$2 $1 = Memory[$2+100] store word sw $1,(100)$2 Memory[$2+100] = $1 load half word signed lh $1,(100)$2 $1 = Memory[$2+100] lhu $1,(100)$2 $1 = Memory[$2+100] store half word sh $1,(100)$2 Memory[$2+100] = $1 load byte signed lb $1,(100)$2 $1 = Memory[$2+100] load byte unsigned lb $1,(100)$2 $1 = Memory[$2+100] store byte sb $1,(100)$2 Memory[$2+100] = $1 load half word unsigned transfert branchements Conditionnels Move from HI mfhi $1 $1 = HI Move from LO mflo $1 $1 = LO Move to HI mthi $1 HI = $1 Move to LO mtlo $1 LO = $1 $1 = 100 * 216 load upper immediate lui branch on equal beq $1,$2, label if ($1 == $2) go to label branch on not equal bne $1,$2, label if ($1 != $2) go to label $1,100 Branch if greater or equal zero bgez $1, label if ($1 >= 0 ) go to label Branch if greater than zero bgtz $1, label if ($1 > 0 ) go to label Branch if less or equal zero blez if ($1 <= 0 ) go to label Branch if less than zero bltz $1, label $1, label if ($1 < 0 ) go to label Branch if greater or equal zero and link bgezal $1, label $ra = PC + 4; if ($1 >= 0 ) go to label Branch if less than zero and link gltzal $1, label $ra = PC + 4; if ($1 < 0 ) go to label jump branchements inconditionnel CHAP II : Microprocesseur MIPS R3000 j label goto lable jump and link jal label $ra = PC + 4; go to label jump register jr $ra PC = $ra set on less than slt $1,$2,$3 if ($2 < $3) $1 = 1; else $1 = 0 set less than immediate slti $1,$2,100 if ($2 < 100) $1 = 1; else $1 = 0 set less than unsigned set less than immediate unsigned ( i.e. return) sltu $1,$2,$3 if ($2 < $3) $1 = 1; else $1 = 0 sltiu $1,$2,100 if ($2 < 100) $1 = 1; else $1 = 0 35 2eme année LMD Informatique Architecture des Ordinateurs CHAP II : Microprocesseur MIPS R3000 4. Directives supportées par l’assembleur MIPS Les directives ne sont pas des instructions exécutables par la machine, mais permettent de donner des ordres à l’assembleur. Toutes les pseudo-instruction commencent par le caractère << . >> ce qui permet de les différencier clairement des instructions. 4.1 Déclaration des sections : text, data et stack Six directives permettent de spécifier quelle section de la mémoire est concernée par les instructions, macro-instructions ou directives qui les suivent. Sur ces six directives, deux sont dynamiquement gérées à l’exécution : ce sont celles qui concernent la pile utilisateur, stack, et la pile système, kstack. Ceci signifie que l’assembleur gère quatre compteurs d’adresse indépendants correspondants aux quatre sections text, data, ktext et kdata. .text .data .stack .ktext .kdata .kstack Passage dans la section text dans le segment utilisateur. Passage dans la section data dans le segment utilisateur. Passage dans la section stack dans le segment utilisateur. Passage dans la section text dans le segment noyau. Passage dans la section data dans le segment noyau. Passage dans la section stack dans le segment noyau. 4.2 Déclaration et initialisation de variables Les directives suivantes permettent de d’initialiser certaines zones dans les sections text ou data de la mémoire. .word Positionne des mots successifs aux valeurs des expressions. .word expression, [expression,] : : : La valeur de chaque expression est placée dans des adresses successives de la section active. Exemple 17 entiers: .word .half -1, -1000, -100000, 1, 1000, 100000 Positionne des demi-mots successifs aux valeurs des expressions. .half expression, [expression,] : : : La valeur de chacune des expressions est tronquée à 16 bits, et les valeurs ainsi obtenues sont placées dans des adresses successives de la section active. Exemple 18 coordonnées: .half .byte .byte 0 , 1024 Positionne des octets successifs aux valeurs des expressions. expression, [expression,] : : : La valeur de chacune des expressions est tronquée à 8 bits, et les valeurs ainsi obtenues sont placées à des adresses successives de la section active. Exemple 19 table: .byte .align 1, 2, 4, 8, 16, 32, 64, 32, 16, 8, 4, 2, 1 expression 36 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Aligne le compteur d’adresse courant afin que expression bits de poids faible soient à zéro. .align n Cet opérateur aligne le compteur d’adresse sur une adresse telle que les n bits de poids faible soient à zéro. Cette opération est effectuée implicitement pour aligner correctement les instructions, demimots et mots. Exemple 22 .align 2 .byte 12 .align 2 .byte 24 .ascii .ascii Déclare et initialise une chaîne de caractères chaîne, [chaîne,] : : : Cet opérateur place à partir de l’adresse du compteur d’adresse correspondant à la section active la suite de caractères entre guillemets. S’il y a plusieurs chaînes, elles sont placées à la suite. Cette chaîne peut contenir des séquences d’échappement du langage C, et doit être terminée par un zéro binaire si elle est utilisé avec un appel système. Exemple 20 message: .ascii .asciiz .asciiz "Bonjour, Maître!\n\0" Déclare et initialise une chaîne de caractères, en ajoutant un zéro binaire à la fin. chaîne, [chaîne,] : : : Cet opérateur est strictement identique au précédent, la seule différence étant qu’il ajoute un zéro binaire à la fin de chaque chaîne. Exemple 21 message: .asciiz .space .space "Bonjour, Maître!\n" Reserve expression octets, et les mets à zéro expression Un espace de taille expression octets est réservé à partir de l’adresse courante de la section active. Exemple 22 nuls: .space 1024 # initialise 1 kilo de mémoire à zéro Tableaux • • • • Zone mémoire dans laquelle les données sont rangées les unes à la suite des autres Repéré par l’adresse du premier élément On accède aux différentes case par déplacement par rapport à la première Déclaration d’un tableau d’entiers de 32 bits int tab[5] = {3, 6, 8, 9, 2}; .data T: 37 .word 3, 6, 8, 9, 2 Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000 Exemple 23 : Programme C void main() { int i = 5; int tab[5] = {3,6,8,9,2}; int somme = 0; do somme += tab[ --i ]; while ( i ) ; printf(" %d ",somme); exit(0); } $a0 ≡ somme ; $a1 ≡ i ; $a2 ≡ tab ; Programme assembleur .data tab : .word 3, 6, 8, 9, 2 .text main : ori $a0, $zero, 0 ori $a1, $zero, 5 la $a2, tab bcl: lw $a3, 0($a2) add $a0, $a0, $a3 addui $a2, $a2, 4 addui $a1, $a1, -1 bne $a1, $zero, bcl ori $v0, $zero, 1 syscall ori $v0, $zero, 10 syscall 38 #somme #taille Architecture des Ordinateurs 2eme année LMD Informatique CHAP III La programmation structurée CHAP III : La programmation structurée 1. La Pile Quand un programme commence à s'exécuter, une certaine section contiguë de mémoire est mise de côté pour le programme appelé la pile. Pendant que le programme fonctionne, la pile se développe en bas dans l'espace disponible, alors que le segment de données se développe vers le haut pendant que le programme fonctionne. Naturellement, dans un programme dynamique, les segments se développent et se rétrécissent. Si la taille combinée des segments excède l'espace disponible leurs frontières se réuniront quelque part au milieu de la gamme. Quand ceci se produit il n'y a plus aucune mémoire. 32 bits … Adresses Croissantes $sp - 8 $sp - 4 $sp Libre Libre Push Pop Tout au début le registre de pile $sp est initialisé à 0x7FFF0000 (l'adresse juste au-dessus du segment .stack). Push (empiler) Pour notre pile de données 4-octets, ajouter un article signifie soustraire quatre de $sp et stocker l'article dans cette adresse. Cette opération s'appelle : empiler Exemple : Empiler le contenu du registre $t0 subu sw $sp, $sp, 4 $t0, ($sp) # Mettre à jour $sp , # ranger $t0 au sommet de la pile . Pop (dépiler) Enlever un article d'une pile s'appelle dépiler. Dépiler un article signifie qu'il est copié à un autre endroit et que l'indicateur de pile est ajusté. Exemple : dépiler le sommet dans $t0 lw addu $t0, ($sp) $sp, $sp,4 # Copie le sommet dans $t0. # $sp adresse l’élément avant . 39 Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée 2. Les Appels de Fonctions L’exécution de fonctions nécessite une pile en mémoire. Cette pile correspond . la section stack. L’utilisation de cette pile fait l’objet de conventions qui doivent être respectées par la fonction appelée et par la fonction appelante. • • • • • • La pile s’étend vers les adresses décroissantes . Le pointeur de pile pointe toujours sur le dernier mot occupée dans la pile. Ceci signifie que tous les mots d’adresse inférieure au pointeur de pile sont libres. Le R3000 ne possède pas d’instructions spécifiques . la gestion de la pile. On utilise les instructions lw et sw pour y accéder. Les appels de fonction utilisent un pointeur particulier, appel. pointeur de pile. Ce pointeur est stock. conventionnellement dans le registre $sp. La valeur de retour d’une fonction est conventionnellement écrite, dans le registre $v0, par la fonction appelée. Par ailleurs, l’architecture matérielle du processeur MIPS R3000 impose l’utilisation du registre $ra pour stocker l’adresse de retour lors d’un appel de fonction. A chaque appel de fonction est associée une zone dans la pile constituant le « contexte d’exécution » de la fonction. Dans le cas des fonctions récursives, une même fonction peut être appelée plusieurs fois et possédera donc plusieurs contextes d’exécution dans la pile. Lors de l’entrée dans une fonction, les registres $t0 . $k0 sont disponibles pour tout calcul dans cette fonction ; mais le contenu des registres utilisés doit être sauvegardé et restauré avant le retour au programme appelant. Dans le cas général, un contexte d’exécution d’une fonction est constitué de trois zones qui sont, dans l’ordre d’empilement: • La zone des arguments de la fonction appelée Les valeurs des arguments sont écrites dans la pile par la fonction appelante et lues dans la pile par la fonction appelée. Dans la suite de ce document, on note na le nombre d’arguments, et on considère que tous les arguments sont représentés par des mots de 32 bits. Par convention, on place toujours le premier argument de la fonction appelée à l’adresse la plus petite dans la zone des arguments. • La zone de sauvegarde des registres La fonction appelée est chargée de sauvegarder le registre $ra, ainsi que les registres de travail qu’elle utilise de façon à pouvoir restaurer la valeur de ces registres avant de rendre la main à la fonction appelante. Dans la suite de ce document, on note nr le nombre de registres sauvegardés en plus du registre $ra. Seuls les registres d’indice supérieur à 7 doivent être sauvegardés (s’ils sont utilisés). Le registre $ra contenant l’adresse de retour est toujours sauvegardée à l’adresse la plus grande de la zone de sauvegarde. • La zone des variables locales de la fonction appelée. Les valeurs stockées dans cette zone ne sont en principe lues et écrites que par la fonction appelée. Elle est utilisée pour stocker les variables et structures de données locales à la fonction. Dans la suite de ce document, on note nv le nombre de mots de 32 bits constituant la zone des variables locales. 3. Organisation de la pile Dans le cas général, une fonction f souhaite appeler une fonction g. La fonction g possède des arguments, utilise des registres et possède des variables locales. La fonction f appelante doit effectuer la séquence suivante : 40 Architecture des Ordinateurs • • • • 2eme année LMD Informatique CHAP III : La programmation structurée décrémenter le pointeur de pile : $sp ← $sp - 4*na, de façon à réserver la place dans la pile pour les arguments. écrire dans la pile les valeurs des na arguments de la fonction g, en mettant le premier argument à l’adresse pointée par $sp, le deuxième à $sp +4, etc... effectuer le branchement . la première instruction de la fonction appelée en utilisant une instruction de type jal ou bgezal. incrémenter le pointeur de pile pour restaurer la valeur qu’il avait avant l’appel de la fonction g: $sp ← $sp + 4*na La fonction g appelée est découpée en trois parties. La première partie est le prologue, qui commence par décrémenter le pointeur de pile de façon à réserver la place pour la sauvegarde du registre $ra et des registres qui seront utilisés par g, ainsi que la place nécessaire aux variables locales de g. Le prologue sauvegarde ensuite dans la pile : la valeur du registre $ra et les valeurs des registres qui seront utilisés par g. La deuxième partie est le corps de la fonction qui effectue les calculs, en utilisant les registres nécessaires ainsi que les variables locales stockées dans la pile, puis écrit la valeur de retour dans le registre $v0. La troisième partie est l’épilogue chargé de : restaurer les valeurs des registres sauvegardés dans la pile, d’incrémenter le pointeur de pile pour lui redonner la valeur qu’il avait en entrant dans la fonction g. Le prologue de la fonction g doit effectuer la séquence suivante: • • • décrémenter le pointeur de pile: $sp ← $sp - 4*(nv + nr + 1) écrire successivement dans la pile suivant les adresses décroissantes la valeur du registres $ra et des nr registres qui seront utilisés par le corps de la fonction. lire dans la pile les arguments de la fonction g et les stocker dans les registres utilisés par le corps de la fonction g. L’épilogue de la fonction g doit effectuer la séquence suivante: • • • lire dans la pile les valeurs des (nr +1) registres sauvegardés (dont le registre $ra) et restaurer les valeurs qu’avaient les registres avant l’appel de la fonction g. incrémenter le pointeur de pile : $sp ← $sp + 4*(nv + nr + 1) effectuer un branchement . l’adresse de retour contenue dans le registre $ra On note R(i) les registres utilisés par la fonction appelée, qui doivent être sauvegardés. On note A(i) les registres utilisés dans l’appelant pour stocker les arguments. On note P(i) les registres utilisés dans l’appelé pour la récupération des arguments. On note v(i) les variables locales déclarées dans la fonction appelée 41 2eme année LMD Informatique Architecture des Ordinateurs CHAP III : La programmation structurée Organisation de la pile Zone des arguments Zone de sauvegarde des registres Zone des variables locales A(na-1) … A(1) A(0) $ra R(0) R(1) … R(nr-1) V(0) V(1) … V(nv-1) • A(i) : ième argument • R(i) : ième registre • V(i) : ième variable locale • na: nombre d’arguments • nr: nombre de registres • nv: nombre de variables locales adresse décroissante 4. Exécution des appels : 4.1. Fonction appelante Met les arguments dans la pile avant de se brancher à la première instruction de la fonction appelée, pour cela elle doit : a) Décrémenter le pointeur de pile selon le nombre d’arguments : $sp ← $sp - 4 * na b) Ecrire dans la pile les arguments en les empilant ($sp, $sp+4…) c) Se brancher à la première instruction de la fonction appelée (jal ou bgezal) d) Incrémenter le pointeur de pile pour revenir à sa valeur initial ($sp + 4 * na) e) Le résultat de la fonction se trouve dans le registre $v0 4.2. Fonction appelée : Au lancement de la fonction, celle-ci doit mettre dans la pile les registres à sauvegarder et les variables locales (Prologue). Prologue a) Décrémenter le pointeur de pile selon le nombre de registres à sauvegarder et le nombre de variables locales : $sp ← $sp - 4 * (nv + nr + 1) b) Ecrire dans la pile la valeur du registre $ra et des autres registres à sauvegarder, ainsi que les variables locales c) Lire dans la pile les arguments et les stocker dans des registres généraux Pour terminer, la fonction appelée restaure les valeurs des registres sauvegardés et revient à la fonction appelante (Epilogue). 42 Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée Epilogue a) Restaurer les valeurs des registres sauvegardés b) Incrémenter le pointeur de pile pour revenir à sa valeur initiale lors du branchement à la fonction c) Se brancher à l’instruction suivante de la fonction appelante Exemple 1: Programme C int val_abs(int n) { if (n < 0) return -n; else return n; } main() { printf("%x", val_abs(-5)); exit(0); } .stack .text main : ori addiu sw jal addiu or ori syscall ori syscall Programme assembleur val_abs: addiu sw $a0, $zero, -5 sw $sp, $sp, -4 lw $a0, 0($sp) add bgez val_abs $sp, $sp, 4 sub $a0, $v0, $zero suite : $v0, $zero, 1 lw lw $v0, $zero, 10 addiu jr 4 $sp, $sp, -8 $ra, 4($sp) $a0, 0($sp) $a0, 8($sp) $v0, $a0, $zero $a0, suite $v0, $zero, $a0 $ra, 4($sp) $a0, 0($sp) $sp, $sp, 8 $ra 5. Les arguments Passage par valeur 1) Les arguments sont recopiés dans la pile a) Les arguments ne sont modifiés que dans la pile b) Toute modification dans la pile n’a aucune implication pour la fonction appelante c) S’il y a beaucoup d’arguments, il faut beaucoup de place dans la pile 2) Une seule valeur de retour dans le registre $v0. Impossibilité de retourner plusieurs valeurs Passage par adresse 1) Ce n’est plus la valeur de l’argument qui est placé dans la pile, mais son adresse a) on modifie directement la valeur de la case mémoire b) Les arguments doivent être déclarés dans la section .data 2) Toute modification de la valeur de la case mémoire est irréversible 43 Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée Exemple 2: Programme C void echange (int * a, int * b) { int tmp; tmp = *a; *a = *b; *b = tmp; } main() { int a = 8, b = 5; echange(&a, &b); printf("%d %d",a, b); exit(0); } Programme assembleur .data echange: var1 : .word 8 addiu var2 : .word 5 sw .stack 4 sw .text sw main : sw la $a0, var1 sw la $a1, var2 lw addiu $sp, $sp, -8 lw sw $a0, 0($sp) lw sw $a1, 4($sp) lw sw jal echange addiu $sp, $sp, 8 sw lw $a0, 0($a0) lw ori $v0, $zero, 1 lw syscall lw lw $a0, 0($a1) lw ori $v0, $zero, 1 lw syscall addiu ori $v0, $zero, jr 10 syscall $sp, $sp, -20 $ra, 16($sp) $a0, 12($sp) $a1, 8($sp) $a2, 4($sp) $a3, 0($sp) $a0, 20($sp) $a1, 24($sp) $a2, 0($a0) $a3, 0($a1) $a3, 0($a0) $a2, 0($a1) $ra, 16($sp) $a0, 12($sp) $a1, 8($sp) $a2, 4($sp) $a3, 0($sp) $sp, $sp, 20 $ra Exemple 3 : fonctions récursives factorial: bgtz int fact ( int n ) ori { jr if ( n <= 0 ) return (1) ; doit: return ( n * fact (n − 1) ); subi }; sw sw n dans $a0 $a0, doit $v0, $zero, 1 $ra # cas 0! = 1 $sp, $sp, 8 $s0, ($sp) $ra, 4($sp) # # # adresse ori subi jal mult mflo $s0, $a0 ,0 $a0, $a0, 1 factorial $v0,$s0 $v0 # # # # lw lw addi jr $s0, ($sp) $ra, 4($sp) $sp, $sp, 8 $ra # restaurer les registres 44 sauver l’argument n-1 $v0 = (n-1)! n*(n-1)! Architecture des Ordinateurs CHAP IV 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction Conception du jeu d'instructions d'un processeur Un jeu d'instructions n'est pas construit par hasard. Il y a 2 règles à connaître : Mix : Ensemble de statistiques sur la fréquence d'utilisation des instructions. Les Mix permettent aux concepteurs de processeur de savoir quels instructions doivent être implémentée et lesquelles peuvent être évitées (et réalisée avec plusieurs instructions). Amdhal Rule : Le gain réel dépend du coût de la mise en place de l'instruction dans le processeur: Gain réel = Gain x Fréquence d'utilisation Il y a 2 caractéristiques qui font qu'un processeur est performant : nombre de cycles par instruction (CPI ou CPIu (utiles)) Fréquence d'horloge F Performance : P = F / CPI But du processeur MIPS : CPI = 1 Raisons du choix d'une instruction : les opcodes coûtent cher beaucoup d'instructions sont inutiles car remplaçables par d'autres MIX et la loi d'Amhdal définissent quelles sont les instructions à inclure dans le processeur. 1. Les instructions Il y a 57 instructions, de 3 types différents : R : Register to Register – Register Type I : Accès mémoire, branchements – Immediate Type J : Instructions de sauts (non-conditionnels) : Jump Type Toutes les instructions ont une longueur de 32 bits et possèdent un des trois formats suivants : OPCOD: numéro de l'instruction SH: Shift Amount : spécifie le nombre de décalage • • • RS : Source RT : Alternatif RD : Destination Le format R est utilisé par les instructions nécessitant 2 registres sources (désignés par RS et RT) et un registre résultat désigné par RD. Exemple: add R3, R4, R5 On aurait R3 dans RD, R4 dans RS, R5 dans RT. Le format I est utilisé par les instructions de lecture/écriture mémoire, par les instructions utilisant un opérande immédiat, ainsi que par les branchements courte distance (conditionnels). 45 Architecture des Ordinateurs 2eme année LMD Informatique Exemple : addi R4, R3, 8 On aurait R4 dans RD, CHAP IV : Conception du jeu d’instruction R3 dans RS, et 8 dans IMD16. Le format J n’est utilisé que pour les branchements à longue distance (inconditionnels). Exemple : J immed 2. Codage des instructions Le codage des instructions est principalement défini par les 6 bits du champs code opération de l'instruction (INS 31:26). Cependant, trois valeurs particulières de ce champ définissent en fait une famille d'instructions: il faut alors analyser d'autres bits de l'instruction pour décoder l'instruction. Ces codes particuliers sont: SPECIAL (valeur "000000"), BCOND (valeur "000001") et COPRO (valeur "010000") DECODAGE OPCOD 000 001 000 SPECIAL BCOND 010 J 011 JAL 100 BEQ 101 BNE 110 BLEZ 111 BGTZ 001 ADDI SLTI SLTIU ANDI ORI XORI LUI 010 COPRO LBU LHU ADDIU 011 100 LB LH LW 101 SB SH SW 110 111 Ce tableau exprime que l'instruction LHU (par exemple) possède le code opération "100101". Lorsque le code opération a la valeur SPECIAL ("000000"), il faut analyser les 6 bits de poids faible de l'instruction (INS 5:0) OPCOD = SPECIAL 001 000 000 SLL 001 JR JALR 010 MFHI MTHI MFLO MTLO 011 MULT MULTU DIV DIVU 100 ADD ADDU SUB SUBU SLT SLTU 101 010 SRL 011 SRA 100 SLLV 101 SYSCALL BREAK AND OR 110 SRLV 111 SRAV XOR NOR 110 111 Lorsque le code opération a la valeur BCOND, il faut analyser les bits 20 et 16 de l'instruction. Lorsque le code opération a la valeur COPRO, il faut analyser les bits 25 et 23 de l'instruction. Les trois instructions de cette famille COPRO sont des instructions privilégiées. 46 Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction 3. Jeu d'instructions Le jeu d'instructions est "orienté registres". Cela signifie que les instructions arithmétiques et logiques prennent leurs opérandes dans des registres et rangent le résultat dans un registre. Les seules instructions permettant de lire ou d'écrire des données en mémoire effectuent un simple transfert entre un registre général et la mémoire, sans aucun traitement arithmétique ou logique. La plupart des instructions arithmétiques et logiques se présentent sous les 2 formes registre-registre et registre-immédiat: ADD : rd ← rs op rt ADDI : rd ← rs op IMD format R format I L’opérande immédiat 16 bits est signé pour les opérations arithmétiques et non signé pour les opérations logiques. Le déplacement est de 16 bits pour les instructions de branchement conditionnelles (Bxxx) et de 26 bits pour les instructions de saut inconditionnelles (Jxxx). De plus les instructions JAL, JALR, BGEZAL, et BLTZAL sauvegardent une adresse de retour dans le registre R31. Ces instructions sont utilisées pour les appels de sous programme. Toutes les instructions de branchement conditionnel sont relatives au compteur ordinal pour que le code soit translatable. L'adresse de saut est le résultat d'une addition entre la valeur du compteur ordinal et un déplacement signé. Les instructions MTC0 et MFC0 permettent de transférer le contenu des registres SR, CR, EPC et BAR vers un registre général et inversement. Ces 2 instructions ne peuvent être exécutées qu’en mode superviseur, de même que l'instruction RFE qui permet de restaurer l'état antérieur du registre d'état avant de sortir du gestionnaire d'exceptions. Exercice 1 : Codez sous forme de hexadécimale les instructions MIPS suivantes : sltiu $v0, $s7, -1 nor $t4, $v0, $v0 sb $a3, 12($s0) Exercice 2 : Donner la forme mnémonique assembleur des mots suivants représentés en hexadécimal : 0x31C90002 0x8C450048 0x00513021 0x00121103 47 2eme année LMD Informatique Architecture des Ordinateurs 31 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RS RS RS RS RS 1 1 1 1 RS RS RS RS 15 RD RD RD RD RD RD 0 0 RD numéro numéro 0 RD RS 0 0 RD RS 0 RS RT RS RT RS RT RS RT RS RT RD RS RT RD RS RT RD RS RT RD RS RT RD RS RT RD RS RT RD RS RT RD RS RT RD RS RT RD 2 3 4 5 6 7 20 10 RT RT RT RT RT RT 0 1 16 17 5 SA SA SA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 offset offset offset offset Adresse mot Adresse mot RS RS RS RS RT RT 0 0 offset offset offset offset 0 0 2 3 4 6 7 8 9 12 13 16 17 18 19 24 25 26 27 32 33 34 35 36 37 38 39 42 43 Instr sll srl sra sllv srlv srav jr jalr syscall break mfhi mthi mflo mtlo mult multu div divu add addu sub subu and or xor nor slt sltu bltz bgez bltzal bgezal j jal beq bne blez bgtz 48 CHAP IV : Conception du jeu d’instruction 8 9 10 11 12 13 14 15 RS RS RS RS RS RS RS RD RD RD RD RD RD RD RD Constante signée Constante signée Constante signée Constante signée Cte non signée Cte non signée Cte non signée Cte non signée addi addiu slti sltiu andi ori xori lui 16 16 16 16 16 16 16 16 16 0 4 8 8 16 16 16 16 16 RD RS 0 1 CS CD mfco mtco bcof bcot tlbr tlbwi tlbwr tlbp rfe 32 33 35 36 37 40 41 43 RS RS RS RS RS RS RS RS RD RD RD RD RD RT RT RT offset offset 0 0 0 0 0 1 2 6 8 16 offset offset offset offset offset offset offset offset lb lh lw lbu lhu sb sh sw Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction 4. Interface du Processeur L'interface entre le processeur et la mémoire est réalisé par les REQUETE signaux ADR[31:0], DATA[31:0], RW[2:0], FRZ, BERR. Les RW requêtes possibles vers la mémoire sont les suivantes: 000 NO ni écriture, ni lecture Dans le cas WW, les 4 octets du bus DATA sont écrits en mémoire à une adresse alignée sur les mots (les 2 bits de poids faible 001 WW écriture d'un mot de ADR ne sont pas pris en compte). 010 WH écriture d'un demi-mot Dans le cas WH, les 2 octets de poids faibles du bus DATA sont 011 WB écriture d'un octet écrits à une adresse alignée sur les demi-mots (le bit de poids 1** RW lecture d'un mot faible de ADR n'est pas pris en compte). Dans le cas WB, l'octet de poids faible du bus DATA est écrit à l'adresse ADR. Dans le cas RW, les deux bits de poids faible de ADR ne sont pas pris en compte, et la mémoire doit fournir sur le bus DATA un mot aligné. Dans le cas des instructions LBU et LHU, c'est le processeur qui effectue le recadrage et l'extension de signe. Dans le cas où le système mémoire ne peut pas satisfaire en un cycle la requête d'écriture ou de lecture (par exemple en cas de MISS dans le cache), le signal FRZ doit être activé : le processeur maintient sa requête tant que le signal FRZ est actif. Dans le cas d'une erreur matérielle lors d'un accès à la mémoire, cette erreur peut être signalée au processeur par le signal BERR 5. Architecture Interne L'architecture interne du processeur se décompose en une partie opérative et une partie contrôle. La partie opérative (PO) contient les registres et les opérateurs. Elle réalise des transferts élémentaires de données entre un ou plusieurs registres sources et un registre destination. Un transfert élémentaire est exécuté en un cycle. La partie opérative est commandée par la partie contrôle (PC). La partie contrôle est chargée de définir, pour chaque cycle d'horloge, les transferts élémentaires qui doivent être réalisés par la partie opérative. La partie contrôle contient principalement un séquenceur décrit comme un automate d'états finis (automate de MOORE). L'interface entre la partie opérative et la partie contrôle est définie par deux nappes de fils. Dans le sens PC → PO, cette nappe de fils est décomposée en six champs de commande qui définissent de fait le format de la micro-instruction. Ce format ainsi que les valeurs possibles des différents champs de commande constituent le "langage de micro-programmation". Dans le sens PO → PC, cette nappe de fils est constituée de signaux de compte-rendu permettant au séquenceur de prendre des décisions. 49 Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction 6. Chemin de Données En plus des registres visibles du logiciel, le processeur possède 3 registres internes: • IR Registre instruction qui mémorise l'instruction lue en mémoire. • DT Registre data qui reçoit la donnée provenant de la mémoire • AD Registre d’adresse qui peut être utilisé comme registre temporaire. Les registres SR et CR sont implantés dans la partie contrôle. Le processeur possède deux bus opérandes X et Y et une seule "boîte à opérations" capable d'effectuer des opérations logiques, arithmétiques, mais aussi des opérations de comparaison, ou des décalages multi-bits. Toutes les opérations s'exécutent en un cycle, sauf les opérations de multiplication et de division qui s'exécutent en deux cycles. Seuls les registres PC et AD permettent d’adresser la mémoire externe. Un mot de 32 bits provenant de la mémoire peut être écrit dans les registres DT ou IR. Un mot de 32 bits provenant de la boîte à opérations peut être écrit dans les registres PC, EPC, SR, CR, BAR, HI, LO, AD, ou dans un registre général R(n). Ceci signifie que cette partie opérative est capable d'effectuer deux transferts élémentaires à chaque cycle: un transfert interne (qui utilise deux registres sources, la boîte à opérations et un registre résultat), et un transfert externe (lecture d'un mot en mémoire externe et écriture dans IR ou DT). Le banc de registre R(n) ne possède que 2 accès simultanés (un en lecture et un en écriture). Des pseudo-registres permettent de forcer des valeurs constantes sur les bus X et Y. Les 32 bits du registre d'instruction IR sont envoyés à la partie contrôle pour lui permettre de prendre des décisions. Par ailleurs, la partie opérative envoie vers la partie contrôle le signal NUL qui vaut 1 quand RES = Ø. Elle renvoie également vers la partie contrôle les bits de signe des deux opérandes X et Y, ainsi que celui du résultat, la retenue de l'UAL et les deux bits de poids faibles du résultat. Ces signaux, calculés par la micro-instruction i peuvent être utilisés par la partie contrôle pour choisir la micro-instruction i+1. 7. Langage de la Micro Programmation A chaque cycle, la partie contrôle envoie vers la partie opérative des signaux de commande qui constituent la micro-instruction. La micro-instruction possède 6 champs dont les valeurs possibles définissent le langage de microprogrammation. Ces valeurs sont définies par des mnémoniques dans les tableaux cidessous : - Le champ OPX définit l'opérande X en entrée de la boîte à opérations. - Le champ OPY définit l'opérande Y en entrée de la boîte à opérations. - Le champ ALU définit l'opération à exécuter par la boîte à opérations. 50 Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction - Le champ RES définit la destination du résultat calculé par la boîte à opérations. - Le champ ADRW définit le type d'échange entre le processeur et la mémoire. - Le champ EXCP contrôle les mécanismes de détection d'exception et de trappes. 51 Architecture des Ordinateurs 2eme année LMD Informatique 52 CHAP IV : Conception du jeu d’instruction Architecture des Ordinateurs CHAP V 2eme année LMD Informatique CHAP V : Exeptions et Interruptions EXCEPTIONS ET INTERRUPTIONS L’espace mémoire est découpé en 2 segments identifiés par le bit de poids fort de l’adresse : adr 31 = 0 ==> segment utilisateur adr 31 = 1 ==> segment système Quand le processeur est en mode superviseur, les 2 segments sont accessibles. Quand le processeur est en mode utilisateur, seul le segment utilisateur est accessible. Le processeur part en exception si une instruction essaie d'accéder à la mémoire avec une adresse correspondant au segment système alors que le processeur est en mode utilisateur. Il existe quatre types d’évènements qui peuvent interrompre l’exécution "normale" d’un programme: les exceptions les interruptions les appels système (instructions SYSCALL et BREAK) le signal RESET Dans tous ces cas, le principe général consiste à passer la main à une procédure logicielle spécialisée qui s’exécute en mode superviseur, à qui il faut transmettre les informations minimales lui permettant de traiter le problème. 1. Exceptions Les exceptions sont des évènements "anormaux", le plus souvent liés à une erreur de programmation, qui empêchent l’exécution correcte de l’instruction en cours. La détection d’une exception entraîne l’arrêt immédiat de l’exécution de l’instruction fautive. Ainsi, on assure que l’instruction fautive ne modifie pas la valeur d’un registre visible ou de la mémoire. Les exceptions ne sont évidemment pas masquables. Il y a 7 types d’exception dans cette version du processeur R3000 : ADEL : Adresse illégale en lecture : adresse non alignée ou se trouvant dans le segment système alors que le processeur est en mode utilisateur. ADES : Adresse illégale en écriture : adresse non alignée ou accès à une donnée dans le segment système alors que le processeur est en mode utilisateur. DBE : Data bus erreur : le système mémoire signale une erreur en activant le signal BERR à la suite d’un accès de donnée. IBE : Instruction bus erreur : le système mémoire signale une erreur en activant le signal BERR à l’occasion d’une lecture instruction. OVF : Dépassement de capacité : lors de l’exécution d’une instruction arithmétique (ADD, ADDI ou SUB), le résultat ne peut être représenté sur 32 bits. RI : Codop illégal: le codop ne correspond à aucune instruction connue (il s’agit probablement d’un branchement dans une zone mémoire ne contenant pas du code exécutable. CPU : Coprocesseur inaccessible: tentative d’exécution d’une instruction privilégiée (MTC0, MFC0, RFE) alors que le processeur est en mode utilisateur. Le processeur doit alors passer en mode superviseur, et se brancher au gestionnaire d'exceptions qui est une routine logicielle implantée conventionnellement à l’adresse "0x80000080". Toutes les exceptions étant fatales dans cette version du processeur R3000, il n’est pas nécessaire de sauvegarder une adresse de retour car il n’y a pas de reprise de l’exécution du programme contenant l’instruction fautive. Le processeur doit cependant transmettre au gestionnaire d'exceptions l’adresse de l’instruction fautive et indiquer dans le registre de cause le type d’exception détectée. 53 Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions Lorsqu’une exception est détectée, le processeur : sauvegarde l’adresse de l’instruction fautive dans le registre EPC sauvegarde l’ancienne valeur du registre d’état SR passe en mode superviseur et masque les interruptions dans SR écrit le type de l’exception dans le registre CR branche à l’adresse "0x80000080". 2. Interruptions Les requêtes d’interruption matérielles sont des évènements asynchrones provenant généralement de périphériques externes. Elles peuvent être masquées. Le processeur possède 6 lignes d’interruptions externes qui peuvent être masquées globalement ou individuellement. L’activation d’une de ces ligne est une requête d’interruption. Elles sont inconditionnellement écrites dans le registre CR, et elles sont prises en compte à la fin de l’exécution de l’instruction en cours si elles ne sont pas masquées. Cette requête doit être maintenue active par le périphérique tant qu’elle n’a pas été prise en compte par le processeur. Le processeur passe alors en mode superviseur et se branche ici encore au gestionnaire d'exceptions. Comme il faut reprendre l’exécution du programme en cours à la fin du traitement de l’interruption, il faut sauvegarder une adresse de retour. Lorsqu’une requête d’interruption non-masquée est détectée, le processeur: sauvegarde l’adresse de retour (PC + 4) dans le registre EPC sauvegarde l’ancienne valeur du registre d’état SR passe en mode superviseur et masque les interruptions dans SR écrit qu’il s’agit d’une interruption dans le registre CR branche à l’adresse "0x80000080". En plus des 6 lignes d’interruption matérielles, le processeur R3000 possède un mécanisme d’interruption logicielle: Il existe 2 bits dans le registre de cause CR qui peuvent être écrits par le logiciel au moyen de l’instruction privilégiée MTC0. La mise à 1 de ces bits déclenche le même traitement que les requêtes d’interruptions externes, s’ils ne sont pas masqués. 3. Appels système: instructions SYSCALL et BREAK L’instruction SYSCALL permet à une tâche (utilisateur ou système) de demander un service au système d’exploitation, comme par exemple effectuer une entrée-sortie. Le code définissant le type de service demandé au système, et un éventuel paramètre doivent avoir été préalablement rangés dans des registres généraux. L’instruction BREAK est utilisée plus spécifiquement pour poser un point d’arrêt (dans un but de déverminage du logiciel): on remplace brutalement une instruction du programme à déverminer par l’instruction BREAK. Dans les deux cas, le processeur passe en mode superviseur et se branche au gestionnaire d'exceptions. Ces deux instructions sont exécutables en mode utilisateur. Elles effectuent les opérations suivantes : sauvegarde de l’adresse de retour (PC + 4) dans le registre EPC sauvegarde de l’ancienne valeur du registre d’état SR passage en mode superviseur et masquage des interruptions dans SR écriture de la cause du déroutement dans le registre CR branchement à l’adresse "0x80000080". 4. Signal RESET 54 Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions Le processeur possède également une ligne RESET dont l’activation, pendant au moins un cycle, entraîne le branchement inconditionnel au logiciel d’initialisation. Cette requête est très semblable à une septième ligne d’interruption externe avec les différences importantes suivantes : elle n’est pas masquable. il n’est pas nécessaire de sauvegarder une adresse de retour. le gestionnaire de reset est implanté à l’adresse "0xBFC00000". Dans ce cas, le processeur : passe en mode superviseur et masque les interruptions dans SR branche à l’adresse "0xBFC00000". 5. Retour d’interruption Avant de reprendre l’exécution d’un programme qui a effectué un appel système (instructions SYSCALL ou BREAK) ou qui a été interrompu, il est nécessaire d’exécuter l’instruction RFE. Cette instruction effectue la restitution de l’état précédent dans le registre SR 6. Gestion du registre d’état SR Le registre d’état contient l’état courant du processeur, défini par le bit de mode KUC et par le bit de masque global des interruptions IEC. La valeur 00 pour les bits KUC et IEC correspond à l’état superviseur et interruptions masquées. Le registre SR contient aussi l’état précédent (bits KUP et IEP) et l’état antérieur (bits KUO et IEO). Il constitue donc une petite pile matérielle capable d’empiler 3 états successifs du processeur. Le registre SR contient par ailleurs 6 bits MIRQ(5:0) permettant de masquer individuellement les 6 interruptions externes et 2 bits MSWI(1:0) permettant de masquer les deux interruptions logicielles. Les 16 bits de poids fort et les deux bits 6 et 7 du registre SR ne sont pas utilisés: On récupère la valeur 0 en lecture et ils ne sont pas modifiés par les écritures. La figure suivante montre le format du registre d’état SR: Lors d’un appel au gestionnaire d'exception, la sauvegarde de l’ancien état et le passage dans l’état "superviseur avec interruptions masquées" peuvent s’effectuer en une seule opération par décalage de deux bits vers la gauche des six bits de poids faible du registre SR (les 8 bits MIRQ et MSWI ne sont pas modifiés) : 55 Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions La restitution de l’ancien état, réalisée par l’instruction RFE, est obtenue par un simple décalage de deux bits vers la droite des six bits de poids faible du registre SR (les 8 bits MIRQ et MSWI ne sont pas modifiés) : 7. Gestion du registre de cause CR Le registre CR contient trois champs. Les 4 bits du champs XCODE(3:0) définissent la cause de l’appel au gestionnaire d'exceptions. Les 6 bits du champs IRQ(5:0) représentent l’état des lignes d’interruption externes au moment de l’appel au gestionnaire d'exception. Les 2 bits SWI(1:0) représentent les requêtes d’interruption logicielle. La figure suivante montre le format du registre de cause CR : Les codes d’exceptions sont les suivants : 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 INT Inutilisé Inutilisé Inutilisé ADEL ADES IBE DBE SYS BP RI CPU OVF Inutilisé Inutilisé Inutilisé Interruption Adresse illégale en lecture Adresse illégale en écriture Bus erreur sur accès instruction Bus erreur sur accès donnée Appel système (SYSCALL) Point d'arrêt (BREAK) Codop illégal Coprocesseur inaccessible Overflow arithmétique 56 2eme année LMD Informatique Architecture des Ordinateurs CHAP VI CHAP VI: Pipline Pipeline 1. Introduction Dans la microarchitecture d'un processeur, un pipeline est une technique de conception des processeurs où l'exécution des instructions est découpée en étages, et où à un instant donné, chaque étage peut exécuter une instruction. Dans une architecture sans pipeline, il faut un certain nombre d’étapes pour exécuter une instruction. Exemple 1 : Etapes : 1. 2. 3. 4. 5. 6. Exemple 2: Etapes : 1. 2. 3. 4. 5. 6. 7. Exemple 3: Etapes : 1. 2. 3. 4. 5. 6. Exemple 3: Etapes : 1. 2. 3. 4. Add Rd, Rs, Rt Lire l'instruction Décoder l'instruction Extraire les opérandes Effectuer le calcul : Add Mettre le résultat dans Rd Calcul de l'adresse de l'instruction suivante Lw Rt, I(Rs) Lire l'instruction Décoder l'instruction Extraire les opérandes Rt, Rs, I Effectuer le calcul I(Rs) Accès mémoire : lecture Résultat dans Rt Adresse suivante Sw Rt, I(Rs) Lire l'instruction Décoder l'instruction Extraire les opérandes Rt, Rs, I Effectuer le calcul I(Rs) Accès mémoire : écriture Adresse suivante Jr Rs Lire l'instruction Décoder l'instruction Extraire l'opérande Adresse suivante On en tire alors un schéma d'exécution général pour le R3000: 1. Lire l'instruction 2. Décoder l'instruction 3. Extraire les opérandes 4. Effectuer une opération 5. Accès mémoire 6. Ecriture du résultat 7. Calcul de l'adresse suivante 57 Architecture des Ordinateurs 2eme année LMD Informatique CHAP VI: Pipline 2. Définition Pour MIPS, le processeur est divisé en 5 étages 1. IF (Instruction Fetch) charge l'instruction à exécuter dans le pipeline. 2. ID (Instruction Decode) décode l'instruction et adresse les registres. 3. EX (Execute) exécute l'instruction (par la ou les unités arithmétiques et logiques). 4. MEM (Memory), dénote un transfert depuis un registre vers la mémoire dans le cas d'une instruction du type STORE (accès en écriture) et de la mémoire vers un registre dans le cas d'un LOAD (accès en lecture). 5. WB (Write Back) stocke le résultat dans un registre. La source peut être la mémoire ou bien un registre. En supposant que chaque étape met 1 cycle d'horloge pour s'exécuter, il faut normalement 5 cycles pour exécuter une instruction, 15 pour 3 instructions : Séquençage des instructions dans un processeur sans pipeline. Il faut 15 cycles pour exécuter 3 instructions. Si l'on insère des registres tampons (pipeline registers) entre chaque unité à l'intérieur du processeur, celui ci peut alors contenir plusieurs instructions, chacune à une étape différente. Les 5 instructions s'exécuteront en 9 cycles, et le processeur sera capable de terminer une instruction par cycle à partir de la cinquième, bien que chacune d'entre elles nécessite 5 cycles pour s'exécuter complètement. Séquençage des instructions dans un processeur doté d'un pipeline à 5 étages. Il faut 9 cycles pour exécuter 5 instructions. À t = 5, tous les étages du pipeline sont sollicités, et les 5 opérations ont lieu en même temps. Au 5e cycle, tous les étages sont en cours d'exécution. 3. Règles du pipeline 1. 2. 3. 4. Les étages du pipeline doivent être équilibrés Calibrer l'horloge sur l'étage le plus long Les étages doivent être séparés par des registres Le matériel doit être spécifique à l'étage 58 2eme année LMD Informatique Architecture des Ordinateurs CHAP VI: Pipline 4. Problèmes Les pipelines provoquent de nouveaux problèmes, en particulier d'interdépendance, ils ne sont pas tous listés ci dessous, juste deux cas simples sont abordés. Interdépendance des données Une instruction ne peut récupérer le résultat de la précédente car celui-ci n'est pas encore disponible. Ainsi, la séquence: add sw $at, $v0, $v1 $at, 1000($zero) // // $at = $v0 + $v1 (1000) = $at Ne stocke pas à l'emplacement mémoire 1000 la valeur de $at contenant la somme $v0 + $v1, mais la valeur de $at contenue avant l'instruction ADD. Pour résoudre ce problème particulier, il est parfois possible de créer des courts-circuits pour amener le résultat de l'étape précédente vers l'unité qui en a besoin directement, sans passer par les registres de pipeline. Interdépendance procédurale Se pose le même problème avec les sauts: lw $ra, 1000($zero) // $ra = 1000 Jr $ra // Saut inconditionnel $ra ne contient pas encore la valeur 1000 au moment où l'instruction de saut va s'exécuter. Une solution possible à ces deux problèmes est d'insérer une instruction entre les deux qui sont interdépendantes. Prenons par exemple la séquence suivante : 1: 2: 3: add add add $t0, $t1, $t2 $t3, $t0, $t2 $t4, $t3, $t1 qui comporte une dépendance directe simple, $t0 ne pouvant être disponible pour la partie droite de la seconde instruction. la première solution, triviale, est d'insérer des NOP (No Operation), c'est ce que font les compilateurs quand on ne précise pas d'option d'optimisation du code : 1: 1b: 2: 3: add NOP add add $t0, $t1, $t2 $t3, $t0, $t2 $t4, $13, $t1 la seconde solution consiste à réarranger les instructions. Dans cet exemple, l'opération de la ligne 3 n'a aucune interdépendance avec les deux précédentes. Le code modifié sera: 1: add $t0, $t1, $t2 2: add $t4, $13, $t1 3: add $t3, $t0, $t2 59 Architecture des Ordinateurs 2eme année LMD Informatique 60 CHAP VI: Pipline Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés Travaux dirigés CHAP I Codage de l’Informations 1. Codification des nombres entiers naturels • Codifier sur 8 bits lorsque cela est possible: (56) 10 ; (127) 10 ; (255) 10 ; (256) 10 (10100) 2 (101000) 2 (101000101) 2 (011000101) 2 ; 28−1; 28 • Codifier sur 16 bits si cela est possible: (1024) 10 ; (65535) 10 ; (5FE) 16 ; 216−1 ; 216; 220 • Effectuer sur 8 bits les opérations binaires suivantes: 76H+64H; 4AH+DEH ; 8CH+9AH ; 37H - 4BH ; 6EH - BOH; B4H - 95H Préciser s'il y a retenue et s'il y a dépassement de capacité 2. Entiers Signés • Donnez le codage sur 8 et 16 bits des nombres suivants: (-1010) 2 ; (-AC) 16 ; (-183) 10 • Donnez la valeur en base 10 des nombres binaires 0101 0101; • Effectuer sur 8 bits les opérations binaires suivantes: 76H+64H; 4AH+DEH ; 8CH+9AH ; 47H -3BH ; 6EH - BOH; B4H - 95H 1001 0001. Préciser si le nombre est nul, s'il est négatif, s'il y a retenue et s'il y a dépassement de capacité. • 3. 4. Calculez l’opposé des nombres relatifs codés sur 16 bits : ABCDH, FFFFH, 5A72H en base 16 et en base 2. Trouvez une autre règle de conversion. Flottants Donnez le codage IEEE des nombres suivants: 1.0; 2; 4; 8; −1; 0.5; −2; 96.875; −544.0625; 299892; 5.5; 19.6; -1/3 Donnez la valeur du nombre suivant stocké et codé selon la norme IEEE: C8 80 00 00 00 Faire l'addition des nombre IEEE suivants: C8 80 00 00 + C8 00 00 00 Donnez pour les nombres stockés et codés selon la norme IEEE: • Le plus grand et le plus petit nombre normalisé représentable (en valeur absolue ou non). • Le codage du zéro • Le codage du résultat d'une division par zéro -126 -126 • Le résultat de la soustraction suivante: (1,1) 2 * 2 – (1,0) 2 * 2 Ecrire des fonctions en C pour : 1. Vérifier si un nombre est valable dans un système de numération à base B 2. Transformer un nombre entier d’une base B en nombre entier sur 16 bits 3. Ecrire un nombre entier 16 bits dans une base B Le nombre entier est lu sous forme de chaîne de caractères (pour les bases > 10, on utilise les chiffres A, B, C, D, E, F ) 61 Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés Machine Von Neumann Exercice 1: 1. Quelle est la fonction de la mémoire principale? 2. Quelle est la fonction du processeur centrale? 3. Qu’est ce qu'un programme? 4. Donner un schéma général d’un ordinateur. 5. Que fait le processeur pour chaque exécution d’une instruction? Exercice 2: 1. Donner une relation entre le Bus Adresse et la taille de la MP. Si la taille de d’une mémoire principale est de 1 Go, quelle est la largeur du bus d’adresse? Donner la taille de cette mémoire en mot mémoire si un mot mémoire = (16 bits, 32 bits, 64 bits) . 62 Architecture des Ordinateurs CHAP II 2eme année LMD Informatique Travaux dirigés Microprocesseur MIPS R3000 Architecture externe Exercice 1: a. Initialiser le registre $a1 à 0 b. Initialiser le registre $a1 à 0x4567 (valeur 16 bits) c. Initialiser le registre $a1 à 0x4567ABCD (valeur 32 bits) Exercice 2: Programmez en assembleur MIPS la fonction F = 2*X + 2*Y - Z . On suppose que la variable X se trouve dans le registre $t0, la variable Y dans $t1, la variable Z dans $t2 et que le résultat de la fonction F se trouve dans le registre $v0. Exercice 3: 1. Ecrire une séquence d’instructions assembleur pour permuter le contenu de 2 registres, On utilisera un registre intermédiaire. 2. Permuter deux registres sans utiliser un registre intermédiaires (penser à XOR). 3. Ecrire une séquence d’instructions assembleur qui permute le contenu de 2 variables 32 bits. Même chose pour deux variables 16 bits, puis 8 bits. Exercice 4: 1. 2. 3. 4. Programmez en assembleur MIPS les expressions (variables à 32 bits): x = y+z–2*t S = a* x2 + b * x + c S = a2 + b2 + c2 (x + 5 - y) * 35 / 3 Exercice 5: a. Supposez que $a0 = 0x1234 et $a1 = 0x3. l’exécution du programme MIPS suivant ? add $t0, $zero, $zero toto: add $t0, $t0, $a0 addi $a1, $a1, -1 bne $a1, $zero, toto srl $t0, $t0, 4 Quelle est la valeur du registre $t0 après b. Supposez le code MIPS suivant, qui reçoit deux entrées dans les registres $t2 et $t3 et produit une sortie dans le registre $s4. add $t1, $zero, $zero lo: beq $t3, $zero, fin add $t1, $t1, $t2 subi $t3, $t3, 1 j lo fin: addi $t1, $t1, 100 add $s4, $t1, $zero a) Décrivez en une phrase la fonction du programme. b) Quelle est la valeur de $s4 à la fin du programme, si $t2 = 4 et $t3 = 6 au début du programme? 63 2eme année LMD Informatique Architecture des Ordinateurs Travaux dirigés Exercice 6: Opérations logiques bit à bit. Pour chaque question, donner la réponse en langage machine MIPS. 1- Multiplier $t0 par 8. 2- Inverser le bit 4 de $t0. 3- Si $t0 est pair, $t0 = 0, sinon $t0 = 1. 4- Mettre à un le bit 7 de $t0. Exercice 7: Programmez en assembleur MIPS les fonctions suivantes: a) PGCD(A, B) = = b) PPCM(A, B) = PPCM(A’, B’) = A' = PPCM(A' + A, B') = PPCM(A', B'+ B) au départ A' = A , B’ = B si si si c) Fn si n = 0 ou n = 1 si n > 1 d) A*B = = = e) Ab = = B PGCD(B , A mod B ) 1 Fn-1 + Fn-2 0 (2*A) * ( B div 2) (2*A) * ( B div 2) + A si A mod B = 0 sinon A' = B' A' < B' B' < A' si B = 0 si B est pair si B est impair = 1 = A(b div 2) * A(b div 2) = A(b div 2) * A(b div 2) * A si si si b = 0 b est pair b est impair Exercice 8: Ecrire des fonctions en MIPS pour : 1. Vérifier si un nombre est valable dans un système de numération à base B 2. Transformer un nombre entier d’une base B en nombre entier sur 16 bits 3. Ecrire un nombre entier 16 bits dans une base B Le nombre entier est lu sous forme de chaîne de caractères (pour les bases > 10, on utilise les chiffres A, B, C, D, E, F ) Exercice 9: Programmez en assembleur MIPS un programme qui lit une phrase terminée par un ‘.’ au clavier et qui et qui affiche (en pascal) le nombre de mots. Exercice 10: Programmez en assembleur MIPS un programme qui lit une phrase terminée par un ‘.’ au clavier et qui et qui affiche (en pascal) le nombre de mots qui se termine par la lettre ‘s’. Exercice 11 : Programmer la fonction copy une chaine de caractères d’un emplacement mémoire à un autre. 64 Architecture des Ordinateurs CHAP III 2eme année LMD Informatique La programmation structurée Exercices : Traduire en assembleur MIPS les programmes C suivants 1. int pgcd(int a, int b ) { while (a != b ) if (a < b) b = b-a; else a = a-b; return( a ) ; } void main() { int a , b ; printf(" entrer a "); scanf("%d", &a) ; printf(" entrer b "); scanf("%d", &b) ; printf(" pgcd = %d ",pgcd(a,b) ); } 2. int pgcd(int a , int b) { if ( !b ) return a ; return pgcd(b , a mod b ) ; } 3. int mul (int a , int b) { if ( !b ) return 0 ; if ( ! (b & 1 ) ) return mul( a << 2 , b >> 2 ); return( a + mul(a << 2 , b >> 2 ) ; } 4. int combi(int n , int p) { If ( !p || p == n || !n ) return 1 ; return combi(n-1 , p ) + combi( n-1 , p-1 ) ; } 65 Travaux dirigés 2eme année LMD Informatique Architecture des Ordinateurs CHAP IV Travaux dirigés Conception du jeu d'instructions d'un processeur Exercice 1 : Codez sous forme de hexadécimale les instructions MIPS suivantes : 1. Utilisation de données immédiates : sltiu lui 2. $v0, $s7, -1 $t1, 0xA5A5 Instructions registres/registres : srlv nor $t0, $t9, $s8 $t4, $v0, $v0 3. Adressage mémoire en mode indirect registre (le seul supporté par le MIPS) : lh sb $a2, 0xFF($a0) $a3, 12($s0) Exercice 2 : nous supposerons pour l’exemple suivant que l’instruction à coder se trouve en $pc=0x00400020, et que les étiquettes auxquelles on saute se trouvent en plus = 0x0040003C, et moins = 0x00400018. jalr j bne bltz $ra, $k1 plus $v0, $v1, plus $v1, moins syscall mfc0 $ra, $13 Décodage : 0x00031880 0x00021080 0x3C16FFFF 0x00A21026 0x80E30006 0xAE2200C8 66 Registres Nom $0 $zero $1 $at $2 $v0 $3 $v1 $4,$5,$6,$7 $a0 … $a3 $8, … , $15 $t0 … $t7 $16, … , $23 $s0 … $s7 $24, $25 $t8, $t9 $26, $27 $k0, $k1 $28 $gp $29 $sp $30 $s8 $31 $ra HI LO PC SR CR EPC BAR Description vaut zéro en lecture, non modifié par écriture Réservé à l’assembleur pour les macros. Ne doit pas être utilisé Utilisé pour les valeurs de retour des fonctions Utilisé. pour les appels systèmes. Contient le numéro d'appel de la fonction système syscall. Utilisés par le compilateur pour optimiser les appels de fonctions pour contenir les arguments Registres de travail utilisable par le code utilisateur Registres de sauvegardes d'usage universel Registres de travail utilisable par le code utilisateur Réservés aux procédures noyau. Pointeur global. Constant pour tout processus . Pointeur de pile Pointeur sur la zone des variables globales (section data) Contient l’adresse de retour d’une fonction Registres spéciaux Poids fort du résultat d’une multiplication sur 64 bits ou reste de division. Poids faible du résultat d’une multiplication sur 64 bits ou quotient de division. Registre compteur de programme (Program Counter). Registres protégés Registre d’état (Status Register). Registre de cause (Cause Register). Registre d’exception (Exception Program Counter). Il contient l’adresse de retour (PC+4) Registre d’adresse illégale, il contient la valeur de l’adresse illégale. (registre numéro 8) Quelques notations: Mem[ad] || Bn X p..q : : : : Contenu de la mémoire d’adresse ad Concaténation entre deux chaînes de bits Réplication du bit B n fois dans une chaîne de bits Sélection des bits p à q dans une chaîne de bits X Categorie Arithmétique Logique Décalages Instruction Exemple Signification addition add $1 = $2 + $3 soustraction sub $1,$2,$3 $1 = $2 - $3 addition immédiate addi $1,$2,100 $1 = $2 + 100 Addition non signée addu $1,$2,$3 $1 = $2 + $3 Soustraction non signée subu add immediat non signée addiu $1,$2,100 $1 = $2 + 100 Multiply signed Mult LO = ($1 *$2)31..0 HI =($1 *$2)63..32 Multiply unsigned Multu Divide signed Div Divide unsigned Divu $1 , $2 L0 = Quotient , HI = reste Move from coprocessor register mfc0 $1,$epc $1 = $epc and and $1,$2,$3 $1 = $2 & $3 or or $1 = $2 | $3 and immediate andi $1,$2,100 $1 = $2 & 100 or immediate or i $1,$2,100 $1 = $2 | 100 xor xor $1 = $2 ⊕ $3 xor immediate xori $1,$2,100 $1 = $2 ⊕ 100 nor nor $1,$2,$3 $1 = $2 nor $3 shift left logical variable sllv $1, $2, $3 $1 = $2 << $3 shift right logical variable srlv $1, $2, $3 $1 = $2 >> $3 shift right arithmetical variable srav $1, $2, $3 $1 = $2 >>* $3 shift left logical sll $1,$2,10 $1 = $2 << 10 shift right logical srl $1,$2,10 $1 = $2 >> 10 shift right arithmetical sra écrire un entier : li $4, 1234567 ori $2, $0, 1 syscall lire une chaîne de caractères : read_str: .space 256 la $4, read_str ori $5, $0, 255 ori $2, $0, 8 syscall $1,$2,$3 $1,$2,$3 $1 , $2 $1 , $2 $1 , $2 $1,$2,$3 $1,$2,$3 lire un entier : ori $2, $0, 5 syscall quitter : ori $2, $0, 10 syscall $1, $2, 10 $1 = $2 - $3 LO = ($1 *$2)31..0 HI =($1 *$2)63..32 L0 = Quotient , HI = reste $1 = $2 >>* 10 écrire une chaîne de caractères : la $4, str ori $2, $0, 4 syscall transfert branchements Conditionnels branchements inconditionnel load word lw $1,(100)$2 $1 = Memory[$2+100] store word sw $1,(100)$2 Memory[$2+100] = $1 load half word signed lh $1,(100)$2 $1 = Memory[$2+100] load half word unsigned store half word lhu $1,(100)$2 sh $1,(100)$2 $1 = Memory[$2+100] Memory[$2+100] = $1 load byte signed lb $1,(100)$2 $1 = Memory[$2+100] load byte unsigned lb $1,(100)$2 $1 = Memory[$2+100] store byte sb $1,(100)$2 Memory[$2+100] = $1 Move from HI mfhi $1 $1 = HI Move from LO mflo $1 $1 = LO Move to HI mthi $1 HI = $1 Move to LO mtlo $1 LO = $1 load upper immediate lui branch on equal beq $1,$2, label if ($1 == $2) go to label branch on not equal bne $1,$2, label if ($1 != $2) go to label Branch if greater or equal zero bgez $1, label if ($1 >= 0 ) go to label Branch if greater than zero bgtz $1, label if ($1 > 0 ) go to label Branch if less or equal zero blez if ($1 <= 0 ) go to label Branch if less than zero bltz Branch if greater or equal zero and link bgezal $1, label $31 = PC + 4; if ($1 >= 0 ) go to label Branch if less than zero and link gltzal $1, label $31 = PC + 4; if ($1 < 0 ) go to label jump j label goto jump and link jal label $31 = PC + 4; go to label jump register jr $31 PC = $31 set on less than slt $1,$2,$3 if ($2 < $3) $1 = 1; else $1 = 0 set less than immediate slti $1,$2,100 if ($2 < 100) $1 = 1; else $1 = 0 set less than unsigned sltu $1,$2,$3 if ($2 < $3) $1 = 1; else $1 = 0 set less than immediate unsigned sltiu $1,$2,100 if ($2 < 100) $1 = 1; else $1 = 0 $1,100 $1, label $1, label $1 = 100 * 216 if ($1 < 0 ) go to label label ( i.e. return) 31 25 20 15 OPCOD RS RT OPCOD RS RD OPCOD 10 RD 5 SH 0 FUNC IMD16 Format R Format I IMD26 Format J DECODAGE OPCOD 000 001 000 SPECIAL BCOND 001 ADDI 010 COPRO ADDIU 010 J 011 JAL 100 BEQ 101 BNE 110 BLEZ 111 BGTZ SLTI SLTIU ANDI ORI XORI LUI LBU LHU 011 100 LB LH LW 101 SB SH SW 110 111 OPCOD = SPECIAL (INS 5:0) 000 SLL 001 000 001 JR JALR 010 MFHI MTHI MFLO MTLO 011 MULT MULTU DIV DIVU 100 ADD ADDU SUB SUBU SLT SLTU 101 110 111 010 SRL 011 SRA 100 SLLV 101 SYSCALL BREAK AND OR 110 SRLV 111 SRAV XOR NOR 31 25 20 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RS RT RT RT RT RT RT RT RT RT RT RT RT RT RT 1 1 1 1 RS RS RS RS 0 1 16 17 0 0 RS 0 2 3 4 5 6 7 RT RT RT RT RT RT 10 5 RD RD RD RD RD RD 0 RD SA SA SA 0 0 0 RD 0 RD 0 0 0 0 0 0 0 0 RD RD RD RD RD RD RD RD RD RD 0 0 0 0 0 0 0 0 0 0 offset offset offset offset Adresse mot Adresse mot RS RS RS RS RT RT 0 0 offset offset offset offset 0 0 2 3 4 6 7 8 9 12 13 16 17 18 19 24 25 26 27 32 33 34 35 36 37 38 39 42 43 Instr sll srl sra sllv srlv srav jr jalr syscall break mfhi mthi mflo mtlo mult multu div divu add addu sub subu and or xor nor slt sltu bltz bgez bltzal bgezal j jal beq bne blez bgtz 8 9 10 11 12 13 14 15 RS RS RS RS RS RS RS RD RD RD RD RD RD RD RD Constante signée Constante signée Constante signée Constante signée Cte non signée Cte non signée Cte non signée Cte non signée addi addiu slti sltiu andi ori xori lui 16 16 16 16 16 16 16 16 16 0 4 8 8 16 16 16 16 16 RD RS 0 1 CS CD mfco mtco bcof bcot tlbr tlbwi tlbwr tlbp rfe 32 33 35 36 37 40 41 43 RS RS RS RS RS RS RS RS RD RD RD RD RD RT RT RT offset offset 0 0 0 0 0 1 2 6 8 16 offset offset offset offset offset offset offset offset lb lh lw lbu lhu sb sh sw