Architecture Matérielle et Logicielle (LIF6) Exercice 1 : Langage machine On se place sur un processeur hypothétique, qui accède à une mémoire centrale dans laquelle la taille d une case mémoire est de 2 octets. Ce processeur dispose des registres suivants : IR, le registre d instruction ; PC, le compteur de programme ; A (comme accumulateur), un registre temporaire pour le stockage du résultat des opérations. Les instructions sont codées comme suit : On détaille les instructions suivantes : 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 opcode mnémonique opcode opération réalisée LOAD (0001) 2 (1) H charger le mot dont l est donnée dans A STORE (0010) 2 (2) H stocker le mot contenu dans A à l donnée ADD (0101) 2 (5) H ajouter l entier naturel à l donnée à A. 1) Combien d instructions, suivant le codage indiqué ci-dessus, peut compter le jeu d instruction? SOLUTION. Il y a 4 bits utilisés pour coder l opcode, ce qui fait 2 4 = 16 opcodes possibles. 2) Quel est le nombre maximal d s auxquelles une telle instruction peut faire référence? SOLUTION. Il y a 12 bits utilisés pour coder l opérande de l instruction, ce qui fait 2 12 = 4096 s possibles. 3) On considère le morceau de programme suivant, écrit en «langage d assemblage» : Que fait ce programme? LOAD (130) H ADD (131) H ADD (132) H STORE (133) H SOLUTION. Ce programme charge le contenu de la case mémoire d (130) H dans A ; ajoute l entier contenu dans la case d (131) H au contenu du registre A, et place le résultat dans A ; ajoute l entier contenu dans la case d (132) H au contenu du registre A, et place le résultat dans A ; stocke le contenu du registre A dans la case mémoire d (133) H. En résumé, le programme ajoute les entiers contenus dans les cases mémoire d s (130) H (131) H et (132) H, et place le résultat de la somme dans la case d (133) H. 4) Traduisez ce programme en langage machine, et représentez le dans la mémoire centrale en plaçant la première instruction à l (100) H. SOLUTION. Il n y a pas de difficulté particulière. Le tout est de bien noter que (1) H code (0001) 2, (2) H code (0010) 2, et que (3) H code (0011) 2. Nicolas Louvet et Laure Gonnord 1/8
(100) H (1130) H (0001000100110000) 2 (101) H (5131) H (0101000100110001) 2 (102) H (5132) H (0101000100110010) 2 (103) H (2133) H (0010000100110011) 2 5) On suppose que le contenu des cases mémoires (130) H à (133) H est initialement le suivant : (130) H (0002) H (131) H (0003) H (132) H (0001) H Représentez le contenu des cases mémoires (130) H à (133) H, ainsi que celui des registres PC, IR et A après l exécution de chacune des instructions considérées. SOLUTION. Initialement, PC contient l de l instruction qui sera exécutée lors du prochaine cycle d instruction, à savoir l (100) H. Par contre, on ne peut rien dire sur IR et A : (130) H (0002) H PC (0100) H (131) H (0003) H IR???? H (132) H (0001) H A???? H A la fin du cycle d instruction qui a permis l exécution de l instruction «LOAD 130 H» : (130) H (0002) H PC (0101) H (131) H (0003) H IR (1130) H (132) H (0001) H A (0002) H A la fin du cycle d instruction qui a permis l exécution de l instruction «ADD 131 H» : (130) H (0002) H PC (0102) H (131) H (0003) H IR (5131) H (132) H (0001) H A (0005) H A la fin du cycle d instruction qui a permis l exécution de l instruction «ADD 132 H» : (130) H (0002) H PC (0103) H (131) H (0003) H IR (5132) H (132) H (0001) H A (0006) H A la fin du cycle d instruction qui a permis l exécution de l instruction «STORE 133 H» : (130) H (0002) H PC (0104) H (131) H (0003) H IR (2133) H (132) H (0001) H A (0006) H (133) H (0006) H 6) Proposez un morceau de programme pour échanger le contenu des cases mémoires (130) H et (131) H. Écrivez votre proposition en langage d assemblage. SOLUTION. On ne dispose ici que d un registre de travail : il faut inévitablement utiliser une case mémoire pour stocker temporairement l une des valeurs à échanger. Supposons ici qu on utilise la case mémoire d (132) H. LOAD (130) H STORE (132) H LOAD (131) H STORE (130) H LOAD (132) H STORE (131) H Nicolas Louvet et Laure Gonnord 2/8
Exercice 2 : Instructions de branchement et boucles Un processeur 8 bits est doté d un espace mémoire de 64 Kio ; à chaque en mémoire centrale correspond une case de 1 octet. Le processeur dispose de 4 registres de travail, indicés de 0 à 4 et notés R0...R3, ainsi que d un program status register (le PSR), qui comporte un drapeau nommé z : ce drapeau est à 1 si la dernière valeur écrite dans l un des registres était nulle, 0 sinon. Les instructions sont codées sur 1 ou 2 octets, comme indiqué dans le tableau ci-dessous : premier octet second octet assembleur action 7 6 5 4 3 2 1 0 7... 0 LD RD,adr RD <- Mémoire[adr] 0 0 0 RD 0 0 0 adr ST RS,adr Mémoire[adr] <- RS 0 0 1 SR 0 0 0 adr ADD RD,RS RD <- RD + RS 0 1 0 RD RS 0 SUB RD,RS RD <- RD - RS 0 1 1 RD RS 0 BR dec5 PC <- adins + 1 + dec5 1 0 0 dec5 BRZ dec5 Si z = 1 alors PC <- adins + 1 + dec5 1 0 1 dec5 Dans ce tableau : RD désigne un registre de destination et RS un registre source (R0...R3) ; PC désigne le compteur de programme ( de la prochaine instruction) ; adr et adins désignent des s en mémoire, codées sur 1 octet ; Mémoire[adr] désigne la case mémoire d adr. Principe des instructions de branchement BR et BRZ : ces instructions permettent de faire des sauts dans le programme, en modifiant la valeur de PC. On note adins l de l instruction de branchement dans le programme, et dec5 est un entier (décalage) codé en complément à 2 sur 5 bits par rapport à cette : Dans le cas de BR dec5, lorsque l instruction est exécutée, alors l instruction qui sera exécutée ensuite est celle à l adins + 1 + dec5 (branchement inconditionnel). Dans le cas de BRZ dec5 : si z = 1 lorsque l instruction est exécutée, alors la prochaine instruction exécutée est celle à l adins + 1 + dec5 (branchement pris), sinon la prochaine instruction sera celle à l adins + 1 (branchement non-pris). Un programmeur qui écrit en langage d assemblage n a pas besoin de calculer lui même les s de son programme : il utilise simplement une étiquette pour désigner l d une instruction ou d une donnée, comme dans le programme ci-dessous. Dans le cas des instructions de branchement, l assembleur calculera lui-même les valeurs de décalage (dec5). one: 1 // case mémoire contenant l entier 1 n: 15 // case mémoire contenant l entier 15 r: 0 // case mémoire contenant l entier 0 LD R0,r //... LD R1,one //... LD R2,n //... loop: BRZ endloop //... ADD R0,R2 //... SUB R2,R1 //... BR loop //... endloop: ST R0,r //... 1) Si un programme comporte une instruction BR dec5 à l adins, dans quel intervalle pourra se trouver l adsuiv de la prochaine instruction à être exécutée? Justifiez votre réponse. SOLUTION. Comme indiqué dans l énoncé, dec5 est un entier codé en complément à 2 sur 5 bits, donc (10000) }{{ 2 dec5 (01111) } 2. }{{} =( 16) 10 =(15) 10 L de la prochaine instruction à être exécutée est donnée par adsuiv = adins + 1 + dec5. On a donc adins (15) 10 adsuiv adins + (16) 10. 2) Les instructions LD et ST décrites dans l énoncé ne permettent pas d accéder à tout l espace mémoire dont dispose le processeur : pourquoi? Nicolas Louvet et Laure Gonnord 3/8
SOLUTION. Dans le codage des instructions LD et ST, seul 1 octet est consacré au codage de l de chargement ou de rangement : cela ne permet coder que 2 8 = 256 s... On est donc loin des 64 kio = 2 16 o adressables par le processeur. 3) Ajouter des commentaires succincts au programme ci-dessus, en indiquant l action algorithmique effectuée par chaque instruction. Expliquez ensuite ce que calcule ce programme. SOLUTION. Il n est pas très difficile d identifier le fait que le programme comporte une boucle, entre l instruction à l désignée par loop et l instruction BR loop. L instruction de branchement conditionnel BRZ endloop provoque la sortie de boucle lorsque la dernière valeur écrite dans l un des registres généraux est nulle, i.e., lorsque R2 = 0. one: 1 // case mémoire contenant l entier 1 n: 15 // case mémoire contenant l entier 15 r: 0 // case mémoire contenant l entier 0 LD R0,r // R0 <- mem[r] = 0 (contenu de la case mémoire désignée par l étiquette r) LD R1,one // R1 <- mem[one] = 1 LD R2,n // R2 <- mem[n] = 15 loop: BRZ endloop // si R2 est nul, sortie de boucle ADD R0,R2 // R0 <- R0 + R2 SUB R2,R1 // R2 <- R2 + R1 BR loop // retour au début de boucle endloop: ST R0,r // mem[r] <- R0 En langage pseudo-algorithmique, le programme précédant peut être traduit de la façon suivante : R0 <- 0; R1 <- 1; R2 <- 15; while(r2!= 0) { R0 <- R0 + R2; R2 <- R2-1; } r <- R0; Le programme calcule donc la somme des entiers naturels compris entre 1 et 15, et place le résultat dans le case mémoire désignée par l étiquette r. 4) On suppose que l étiquette one sera rangée en mémoire à l (001A) H. Complétez le tableau cidessous, en indiquant pour chaque donnée son, et pour chaque instruction l de son premier octet. instruction (001A) H one: 1 n: 15 r: 0 begin: LD R0,r LD R1,one LD R2,n loop: BRZ endloop ADD R0,R2 SUB R2,R1 BR loop endloop: ST R0,r SOLUTION. Il n y a rien de très compliqué, il faut juste faire attention au fait que les instructions d accès à la mémoire occupent deux cases mémoires consécutives, alors que les autres instructions n en occupent qu une seule. Les constantes entières n occupent elles aussi qu une seule case mémoire. Nicolas Louvet et Laure Gonnord 4/8
instruction (001A) H one: 1 (001B) H n: 15 (001C ) H r: 0 (001D) H begin: LD R0,r (001F ) H LD R1,one (0021) H LD R2,n (0023) H loop: BRZ endloop (0024) H ADD R0,R2 (0025) H SUB R2,R1 (0026) H BR loop (0027) H endloop: ST R0,r 5) Calculez la valeur de décalage dec5 pour l instruction BRZ endloop, puis pour l instruction BR loop : détaillez bien vos calculs. Donnez votre résultat en décimal puis en binaire. SOLUTION. Dans le cas de l instruction BRZ endloop, on sait d après la question précédente que l de cette instruction est (0023) H, et que la destination du branchement s il est pris est l instruction ST R0,r, qui se trouve rangée à l (0027) H. D après l énoncé, l de destination est addest = adins + 1 +dec5, donc dec5 = addest adins 1 = (0027) H (0023) H 1 = (3) 10. Notez que cela pouvez se lire directement dans le tableau de la question précédente : en partant de la case mémoire suivant celle de l instruction BRZ endloop, combien de cases mémoire doit-on sauter pour arriver à l instruction ST R0,r? Justement, 3. Dans le cas de l instruction BR loop, on doit s attendre à un résultat négatif, puisqu il faut «remonter» dans le programme. On a dec5 = (0023) H (0026) H 1 = (4) 10. Pour la suite, il est utile de calculer la représentation de (4) 10 en complément à 2 sur 5 bits ; on trouve (4) 10 = (11100) 2. 6) Donnez le codage en binaire du programme (rayez les octets inutiles) : instruction premier octet second octet 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 one: 1 n: 15 r: 0 begin: LD R0,r LD R1,one LD R2,n loop: BRZ endloop ADD R0,R2 SUB R2,R1 BR loop endloop: ST R0,r SOLUTION. A défaut de rayer les octets inutiles, dans cette correction les cases correspondantes seront laissées vides... Le tableau est complété simplement en utilisant le codage proposé dans l énoncé. Nicolas Louvet et Laure Gonnord 5/8
instruction premier octet second octet 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 one: 1 0 0 0 0 0 0 0 1 n: 15 0 0 0 0 1 1 1 1 r: 0 0 0 0 0 0 0 0 0 begin: LD R0,r 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 LD R1,one 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 LD R2,n 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 loop: BRZ endloop 1 0 1 0 0 0 1 1 ADD R0,R2 0 1 0 0 0 1 0 0 SUB R2,R1 0 1 1 1 0 0 1 0 BR loop 1 0 0 1 1 1 0 0 endloop: ST R0,r 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 7) Donnez le codage en mémoire du programme, en donnant le contenu des cases de la mémoire en hexadécimal : (001A) H contenu contenu SOLUTION. (001A) H (01) H (001B) H (0F ) H (001C ) H (00) H (001D) H (00) H (001E) H (1C ) H (001F ) H (08) H (0020) H (1A) H (0021) H (10) H (0022) H (1B) H (0023) H (A3) H (0024) H (44) H (0025) H (72) H (0026) H (9C ) H (0027) H (20) H (0028) H (1C ) H Nicolas Louvet et Laure Gonnord 6/8
Exercice 3 : Petits calculs autour d une carte mère Les tailles des mémoires sont des puissances de deux ou des multiples de telles puissances. On utilise parfois les préfixes SI en leur associant la puissance de 2 la plus proche : par exemple 1024 octets est souvent abusivement noté 1 ko, bien que 1 ko = 1000 o... La norme CEI-60027-2 définie des préfixes binaires pour éviter la confusion : préfixe symbole puissance puissance de 10 standardisé standardisé de 2 la plus proche tébi Ti 2 40 10 12 = T gibi Gi 2 30 10 9 = G mébi Mi 2 20 10 6 = M kibi ki 2 10 10 3 = k Ainsi, 1024 octets = 1 kibi-octet = 1 kio. On utilisera ces préfixes binaires par la suite. La carte mère d un PC regroupe des fonctionnalités de base d un ordinateur : processeur, mémoire centrale et gestion des E/S. Disques durs CD/DVD Claviers / Souris Modem Mémoire centrale Contrôleur disques Ports séries Bus mémoire centrale Bus mémoire de masse Bus d extensions séries Processeur Bus systeme Contrôleur mémoire Contrôleur d E/S Contrôleur de configuration et de démarrage Bus mémoire graphique Carte graphique Connecteurs de cartes d extensions Carte son Carte SCSI Carte Ethernet Partie 1 : Bande passante d un bus La bande passante d un bus, aussi appelée débit crête, est la quantité de données pouvant circuler sur ce bus par unité de temps. Sur la carte mère d un PC, le bus reliant le processeur au contrôleur mémoire est le bus système, souvent appelé Front Side Bus (FSB). Supposons ici que le FSB d un certain ordinateur est capable d assurer le transfert de 8 octets à la fréquence de 400 MHz. Un contrôleur mémoire prend à sa charge les échanges entre le processeur et la mémoire centrale, entre le processeur et le contrôleur d E/S, et entre le processeur et la mémoire vidéo. Le contrôleur mémoire peut en outre mettre en place un accès direct entre le contrôleur d E/S et la mémoire centrale ou la mémoire vidéo (accès DMA pour Direct Memory Access) : le contrôleur d E/S pourra par exemple transférer directement des données d un périphérique à la mémoire vidéo sans qu elles transitent par le processeur. 1) Quelle est la bande passante du bus FSB considéré exprimée en Go/s? Rappelons que 1 Go = 10 9 o. SOLUTION. Le bus considéré peut transférer 8 o à la fréquence de 400 MHz = 4 10 8 Hz, soit 8 o toutes les 1/4 10 8 s, donc 8 4 10 8 octets par seconde : sa bande passante est donc 32 10 8 o/s = 3.2 Go/s. 2) Quelle est la bande passante du bus FSB considérée exprimée en Gio/s? Rappelons que 1 Gio = 2 30 o. SOLUTION. Le bus considéré peut transférer 32 10 8 octets par seconde. 32 10 8 o = 32 108 2 30 Gio 2.980 Gio. Nicolas Louvet et Laure Gonnord 7/8
Sa bande passante est donc de 2.980 Gio/s. 3) Supposons que le bus mémoire centrale permet le transfert de mots de 32 bits à la fréquence de 266 MHz. Quelle est la bande passante du bus mémoire centrale en Go/s? SOLUTION. Sa bande passante est donc de 266 4 10 6 o/s = 1064 10 6 o/s = 1.064 Go/s. 4) Que penser de la différence de bande passante entre le bus de la mémoire centrale et celle du FSB? SOLUTION. Il est normal que le FSB ait une bande passante plus importante que celle du bus de la mémoire centrale, car il doit absorber des échanges de données avec d autres contrôleurs (contrôleur d E/S et carte graphique). Partie 2 : Lecture d un film Un film est lu à partir d un disque dur, connecté via le bus IDE au contrôleur de disque. Le film est noncompressé, et constitué d une succession d images de 512 384 pixels en 256 couleurs. On suppose que le défilement des images se fait en 24 images par seconde. 1) Quels sont les bus utilisés pour le transfert? SOLUTION. On suppose qu un accès direct (DMA pour Direct Memory Acces) est mis en place entre le contrôleur d E/S et la mémoire vidéo pour le transfert des images du film. Dans ce cas, les bus utilisés sont : le bus de la mémoire de masse, entre le contrôleur de disque et le contrôleur d E/S ; le bus reliant le contrôleur d E/S au contrôleur mémoire ; le bus de la mémoire graphique, entre le contrôleur mémoire et la carte graphique. 2) Quel est le débit (en Mo/s) requis pour le transfert du film du disque dur à la mémoire vidéo? SOLUTION. 256 = 2 8, donc il faut 8 bits, soit 1 octet, pour coder la couleur de chaque pixel d une image. Chaque image compte 512 384 = 196608 pixels, donc chaque image occupe 196608 octets. Comme il faut transférer 24 images par seconde, le débit est de 196608 24 o/s = 4718592 o/s 4.7185 Mo/s. 3) Supposons que le bus de la mémoire vidéo a une bande passante identique à celle du bus de la mémoire centrale. Quelle est la part (en pourcentage) de la bande passante du bus de la mémoire vidéo est consommée par la lecture du film? SOLUTION. La part consommée est de (4.7185 Mo/s) / (1.064 Go/s) = 4.7185/1064 = 0.44%. C est donc très faible. Nicolas Louvet et Laure Gonnord 8/8