GIF-16116, 11 mars 2009 Nom/Matricule : _________________________
Examen 1
Cet examen vaut 35% de la note totale du cours. Les questions seront corrigées sur un total de 35 points.
La valeur de chaque question est indiquée avec la question. Une calculatrice scientifique peut être utilisée.
Cependant, aucune documentation, autre que les annexes, n’est permise. Vous pouvez répondre aux questions directement sur ce questionnaire et/ou dans le cahier bleu mis à votre disposition.
Q1 (2 points) : Supposez un microprocesseur simple relié à une mémoire par un bus de données, un bus d’adresses et un bus de contrôle. Si le microprocesseur exécute une instruction pour écrire une variable dans la mémoire à partir d’un registre (i.e. MOV Mavar, AX), dans quel ordre les évènements suivants surviendront-ils, s’ils surviennent :
a) Le microprocesseur met l’adresse de la variable à écrire sur le bus d’adresse.
b) La mémoire active la ligne de contrôle pour que le microprocesseur lise la donnée c) Le microprocesseur met la valeur du registre sur le bus de données.
d) Le microprocesseur met la valeur du registre sur le bus d’adresse.
e) Le microprocesseur met l’adresse du registre sur le bus d’adresse.
f) La mémoire met l’adresse du registre sur le bus d’adresse.
g) Le microprocesseur active la ligne de contrôle pour écrire la mémoire.
Note : Certains évènements de la liste ci-dessus ne font pas partie de la réponse.
R1: a – c - g
Q2 (2.5 points) : Les phrases suivantes définissent un mot relié à l’architecture d’un microprocesseur. Dites de quel mot ou concept il s’agit :
Description Mot ou Concept
Découpage des instructions en sous parties afin d’exécuter des sous parties différentes de plusieurs instructions simultanément.
Pipeline
Unité de calcul exécutant les opérations arithmétiques ou booléennes à l’intérieur du microprocesseur.
ALU
Variable ayant un rôle spécial à jouer à l’intérieur du µprocesseur. Registre Partie d’une instruction décrivant ce que fait l’instruction, mais
pas ses paramètres.
Opcode
Petite mémoire très rapide servant de tampon pour accélérer le transfert de données entre le microprocesseur et la mémoire vive.
Cache
Q3 (3 points) : Si on suppose un 8086 avec des instructions tel que décrit en annexe B et si le bus de données a 16 bits, combien d’accès à la mémoire seront requis pour lire et exécuter la séquence d’instructions suivante :
PUSH AX ADD AX,CX MOV [BX],AX
Expliquez brièvement votre réponse en donnant le détail pour chaque instruction.
R3 : Il faut lire les instructions et les exécuter ensuite comme illustrer dans la table ci-dessous:
Instruction Taille #accès pour lecture de l’instruction
#accès pour exécution
Commentaire/Total
PUSH AX 2 octets 1 1 La pile est dans la
mémoire. Total = 2
ADD AX,CX 3 octets 2 0 2
MOV [BX],AX
3 octets 2 1 3
Total 7
Q4 (8 points) : On vous demande de faire une fonction calculant un bit de parité paire.
Un bit de parité paire est un bit qui sera 1 si le nombre de 1 dans l’octet est impair.
Autrement dit, le nombre de 1 dans l’octet et dans la parité sera pair. Par exemple, si vous avez 00110010b, le bit de parité vaudra 1, car il y a trois bits à 1 dans l’octet.
En assumant qu’il n’y a pas de drapeau de l’ALU donnant la parité, concevez une fonction en assembleur 8086 qui recevra, en paramètre d’entrée, un octet passé par le registre AL. Le bit de parité est retourné dans le drapeau C.
La séquence suivante pourrait appeler votre fonction :
MOV AL, OctetATransmettre CALL CalculeParite
JC CasParitePaire
Votre fonction doit être propre et elle doit être commentée.
R4) Il y a plusieurs réponses possibles!!!
CalculeParite PROC
PUSH AX ;AX contient le byte à transmettre
PUSH BX ;BX contient le nombre de 1 dans le byte PUSH CX ;CX est un compteu
MOV BX,0
MOV CX, 8 ;Initialise une boucle de 8 qui compte les 1 dans le byte Boucle:
RCR AX,1 ;Décale AX de 1 vers la droite. Le bit LSB est dans C.
JNC ProchainBit
INC BX ;Ajoute 1 à BX si le bit courant est 1 ProchainBit:
SUB CX,1
JNZ Boucle ;Les 8 bits sont testés?
CLC ;Met 0 par défaut dans C
TEST BX,1 ;Si le nombre de 1 dans le byte à transmettre est impair…
JZ CalculParitefin STC ;Met 1 dans C CalculParitefin:
POP CX POP BX POP AX RET
CalculeParite ENDP
Q5 (2.5 points) : Remplacez les séquences d’instructions suivantes par une instruction unique :
Séquence PUSH AX SUB AX,BX POP AX
PUSH AX RET
PUSH AX MOX AX,BX MUL 2 MOV BX,AX POP AX
PUSH BX LEA BX,Var1 MOV AX,[BX]
POP BX
SAR BX, 3 SAL BX, 3
;Ignorez les
;drapeaux Instruction CMP AX,BX JMP AX SAL BX, 1 MOV AX,Var1 AND BX,
0xFFF8
Q6 (3 points) : Vous avez un disque dur de 10 Gigaoctets. Sachant que le disque dur a 10 plateaux, 20 têtes de lecture, 100 pistes par plateaux, 100 cylindres et 1000 secteurs par piste, quelle est la taille des blocs de données sur ce disque. Assumez qu’un Gigaoctet est 109 plutôt que 10243 octets afin de simplifier les calculs.
R6) Capacité = #surfaces * #pistes/surface * #blocs/piste * taille de bloc En considérant que
#surfaces = #têtes et que #blocs/piste = #secteurs/surface :
taille de bloc = Capacité / [#surfaces * #pistes/surface * #blocs/piste ] taille de bloc = 10*10^9 bytes / [20 surfaces * 100 pistes/surface * 1000 blocs/piste]
Q7 (2 points) : Sachant que l’on utilise l’instruction CMP AL, BL afin de changer la valeur des drapeaux, donnez, pour toutes les combinaisons possibles de AL et BL, la valeur des drapeaux Zero et Overflow.
Par exemple, le drapeau Carry (emprunt) sera 1 si BL est plus grand que AL lorsque AL et BL sont tous deux positifs.
R7) Le drapeau Zero sera à 1 si AL == BL, 0 sinon
Le drapeau Overflow sera à 1 si AL – BL donne un résultat qui n’est pas entre -128 et 127, 0 sinon.
Q8 (2 points) : Donnez un exemple de séquence de code assembleur qui justifie de passer les drapeaux de l’ALU en paramètre lorsqu’une interruption survient.
R8) CMP AL, BL JZ qqpart
Si l’interruption survient entre les deux instructions, le drapeau 0 doit être sauvegardé.
Q9 (10 points) : Tous les énoncés suivant sont totalement ou partiellement faux. Dites brièvement pourquoi ou dites comment rendre l’énoncé vrai. Un énoncé peut être faux pour plusieurs raisons. Notez que les énoncés s’appliquent au 8086 lorsque ce n’est pas spécifié. Exemple : l’énoncé « Le cours d’OSA est peu intéressant, mais les laboratoires sont instructifs. » serait faux en raison du mot « peu » ☺.
# Énoncé Faux
A Selon la loi de Moore, la vitesse d’horloge des microprocesseurs double à tous les 18 à 24 mois.
Le nombre de transistor par unité de surface double…
B Pour assurer que les ordinateurs démarreront toujours, les instructions exécutées au démarrage sont à l’intérieur du microprocesseur, dans une mémoire non-volatile.
.. à l’intérieur de la mémoire…
C Dans une architecture CISC, les instructions ont des longueurs diverses et elles accomplissent des tâches complexes. Cela permet de simplifier l’architecture du microprocesseur et de reproduire la taille des programmes.
Une architecture CISC est plus complexe à implémenter que RISC.
D Lorsque le microprocesseur rencontre une directive #IFDEF en mémoire, il l’exécute comme une instruction if en langage C.
Une directive #IFDEF est précompilée et elle n’est jamais « vue » par le microprocesseur
E Le compilateur relie les fichiers objet de plusieurs modules pour créer un programme.
L’assembleur génère des fichiers objet.
L’éditeur de liens relie…
F Les instructions CALL, PUSH, RETI, MOV, INT et CMP changent le pointeur de pile (SP) automatiquement.
MOV et CMP ne changent pas SP.
G Le nombre 4112 en décimal est représenté en hexadécimal sur 2 bytes. En Big Endian, la plus haute adresse en mémoire contiendra le byte le moins significatif. En Little Endian, la plus haute adresse en mémoire aurait un contenu différent.
L’affirmation serait vraie si 4112 n’était pas 0x1010. Peu importe la convention, 0x1010 apparaîtra comme 0x1010!!!
H Le principal avantage de la notation complément à 2 est qu’il est plus facile de représenter les données en fractions.
La notation complément 2 représente les entiers négatifs
I Le contrôleur de DMA contrôle le bus d’adresse du microprocesseur en même temps que ce dernier afin de doubler la vitesse des accès à la mémoire.
Il n’y a qu’un seul contrôleur de bus d’adresse à un temps donné sur un bus.
J Un bus d’ordinateur est un programme qui gère les échanges de données entre un périphérique et un microprocesseur.
Un bus est un groupe de fils…
QBonus (3 points bonus) : Une fonction réentrante est définie comme une fonction qui peut s’appeler de différents contextes simultanément sans que cela ne pose de problème.
Par exemple, si la fonction MAFUN est appelée dans le main et si la fonction MAFUN est aussi appelée dans l’interruption #8, la fonction MAFUN sera dite réentrante s’il n’y a pas de problème à ce que l’interruption #8 se produise lorsque MAFUN est exécutée dans le main.
Trois méthodes de passage de paramètres ont été vues dans le cours : par la pile, par registres et par variables globales. Laquelle (lesquelles) de ces méthodes permet d’écrire des fonctions réentrantes et sous quelles conditions? Laquelle (lesquelles) ne le permet pas? Expliquez, dans tous les cas, pourquoi.
Une fonction propre utilisant la pile est réentrante.
Une fonction propre utilisant les registres est réentrante si la fonction sauvegarde les paramètres d’entrée et de sortie (sur la pile par exemple) ou si elle ne les modifie pas.
Une fonction utilisant des variables globales n’est pas réentrante.
Annexe A : Liste non exhaustive des instructions du 8086
Instruction Description ADD a,b Effectue a = a+b.
AND a,b Effectue a = a ET b, où ET est un ET logique.
CALL proc Appelle la procédure proc et empile l’emplacement de retour.
CLC Met à 0 le drapeau de retenue (carry).
CMP a,b Effectue a-b, a et b sont inchangés.
DEC a Décrémente a.
DIV mot Effectue AX = DXAX/mot, non signé, le résultat est tronqué (arrondi inférieur).
IDIV mot Effectue AX = DXAX/mot, signé, le résultat est tronqué (arrondi inférieur).
IMUL mot Effectue DXAX = AX*mot, signé.
IN dst, port Met la valeur lue sur le port de I/O port dans dst.
INC a Incrémente a.
INT a Appelle la routine de service d’interruption a. Empile les drapeaux et l’emplacement de retour.
IRET Retourne d’une int. en dépilant l’emplacement de retour et les drapeaux.
JC label Saute à l’instruction désignée par label si le drapeau Carry est 1.
JMP label Saute à label. La prochaine instruction exécutée est désignée par label.
JNC label Saute à l’instruction désignée par label si le drapeau Carry est 0.
JNZ label Saute à l’instruction désignée par label si le drapeau Zéro est 0.
JNS label Saute à l’instruction désignée par label si le drapeau Signe est 0.
JZ label Saute à l’instruction désignée par label si le drapeau Zéro est 1.
JS label Saute à l’instruction désignée par label si le drapeau Signe est 1.
LEA dst,var Met l’adresse de la variable var dans dst.
MOV dst,src Met le contenu de src dans dst. Ne change pas les drapeaux.
MUL octet Effectue AX = AL*octet, non signé.
NEG a Inverse tous les bits de a, puis ajoute 1.
NOT a Inverse tous les bits de a.
OR a,b Effectue a = a OU b, où OU est un OU logique.
OUT port, src Met la valeur de src sur le port de I/O port.
POP mot Dépile un mot. Ne change pas les drapeaux.
POPF Dépile les drapeaux.
PUSH mot Empile un mot. Ne change pas les drapeaux.
PUSHF Empile les drapeaux.
RET et RETF Retourne d’une procédure en dépilant l’emplacement de retour. RET dépile IP. RETF dépile IP puis CS.
RCL a,b Fait une rotation de b bits vers la gauche. La rotation inclut le bit de Carry.
RCR a,b Fait une rotation de b bits vers la droite. La rotation inclut le bit de Carry.
SAL a,b Décale tous les bits de a vers la gauche d’un nombre de bits égal à b. Des zéros sont mis à droite. Carry prend la valeur du bit disparu.
SAR a,b Décale tous les bits de a vers la droite d’un nombre de bits égal à b. Le bit le plus significatif de a est mis à gauche. Carry prend la valeur du bit disparu.
STC Met à 1 le drapeau de Carry SUB a,b Effectue a = a-b.
TEST a,b Effectue a ET b, où ET est un ET logique.
XOR a,b Effectue a = a XOR b, où XOR est un OU eXclusif.
Annexe B : Table ASCII et codes op (opcodes) du 8086
Dec Hex Chr
65d 41h A
66d 42h B
… … …
76d 4Ch L
… … …
90d 5Ah Z
… … …
97d 61h a
98d 62h b
… … …
108d 6Ch l
… … …
122d 7Ah z
Sous-ensemble de la table ASCII
Instruction Taille Opcode Paramètres
ADD Reg/Reg 3 bytes 21h Deux bytes pour décrire les deux registres qu'il faut additonner ADDA Reg 2 bytes 22h Un byte pour décrire le registre qu'il faut additonner à AX
JMP Reg 2 bytes 40h Un byte pour décrire le registre désignant la prochaine instruction (IP) JMP dest 3 bytes 41h Deux bytes pour décrire le IP de la prochaine instruction
MOV Reg/Reg 3 bytes 80h Deux bytes pour décrire le registre source et le registre destination MOV Reg/Mem 4 bytes 81h Un byte pour décrire le registre et deux byte pour décrire l'adresse MOV Mem/Reg 4 bytes 83h Un byte pour décrire le registre et deux byte pour décrire l'adresse POP Reg 2 bytes A0h Un byte pour décrire le registre qu'il faut dépiler
POP Mem 3 bytes A2h Deux byte pour décrire l'adresse qu'il faut dépiler PUSH Reg 2 bytes A1h Un byte pour décrire le registre qu'il faut empiler PUSH Mem 3 bytes A3h Deux byte pour décrire l'adresse qu'il faut empiler Opcodes et paramètres fictifs d'instructions 8086
Note: Les données contenues dans cette table sont fictives