GIF-16116, 12 mars 2008 Nom/Matricule : _________________________
Examen 1
Cet examen vaut 40% de la note totale du cours. Les questions seront corrigées sur un total de 40 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 deux 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) : Additionner deux nombres en notation complément 2 change les
drapeaux Overflow et Carry du 8086. Pour chaque cas ci-dessous, donnez un exemple de deux nombres sur 8 bits dont l’addition met les drapeaux dans l’état indiqué. Assumez que les drapeaux sont gérés en fonction d’un résultat sur 8 bits :
Overflow Carry Nombre 1 Nombre 2
0 0
0 1
1 0
1 1
Q2 (3 points) : Les phrases suivantes définissent une composante de la carte mère d’un ordinateur. Dites de quelle composante il s’agit :
Description Composante
Mémoire non-volatile contenant le programme de démarrage de votre ordinateur
Transfert direct de données d’un périphérique vers/de la mémoire sans implication du CPU
Toujours à l’intérieur d’un CPU moderne, elle contient les dernières instructions exécutées et les dernières données utilisées Elle est habituellement constituée de mémoire dynamique RAM dans votre ordinateur
Ensemble de lignes conductrices servant à véhiculer de l’information binaire.
Q3 (3 points) : Pour exécuter deux instructions d’assembleur 8086, combien d’accès à la mémoire sont requis au minimum? Au maximum? Combien d’accès à la mémoire sont requis pour faire l’instruction « POP MaVariable »? Faites les assomptions suivantes:
- La plus courte instruction du 8086 est une addition d’un registre avec AX. Cette instruction est codée sur deux bytes. La plus longue instruction du 8086 est un MOV, codé sur quatre bytes. Le « POP MaVariable » est codé sur trois bytes.
- Le bus de données a 16 bits.
Expliquez brièvement vos réponses. Vous retrouverez en annexe B des données qui vous aideront à répondre à la question.
Q4 (4 points) : Vous avez codé le programme suivant en assembleur 8086 :
ORG 6C6Ch MOV AX,1 MaVar DB ‘Allo’
LEA BX,MaVar MOV AX,[BX+2]
TourneEnRond:
JMP TourneEnRond
a) Quelle est la valeur, en hexadécimal, de AX si on exécute le programme à partir de 6C6Ch pendant un temps infini?
b) Si on réécrivait le programme en déplaçant la ligne « MaVar DB ‘Allo’» juste après l’instruction « JMP TourneEnRond » cela changerait-il la valeur de AX? Si oui, donnez la nouvelle valeur. Si non, expliquez.
Vous retrouverez en annexe B des données qui vous aideront à répondre à la question.
Q5 (4 points) : Afin d’exécuter un programme dans un ordinateur avec l’architecture Von Neumann, un microprocesseur doit contenir un ensemble minimum de registres. Par exemple, le microprocesseur doit contenir un registre indiquant l’adresse sur le bus d’adresse et un registre servant de tampon pour les données allant ou provenant du bus de donnée. Énumérez et décrivez l’ensemble minimum de registres que doit contenir le plus élémentaire des microprocesseurs afin d’exécuter un programme simple. En d’autres mots, complétez la table qui suit.
Registre(s) Nom Description/Rôle
MAR Memory Address Reg. Indique l’adresse sur le bus d’adresse
MDR Memory Data Reg. Tampon pour les données vers/du bus de données
Q6 (3 points) : Un disque dur de 8Go a 4 plateaux, 8 têtes de lecture, 1000 cylindres, 1000 pistes, 1000 secteurs, 1000 blocs de données par piste et une vitesse de rotation de 1000 rpm (tours par minute). Quelle est la taille d’un bloc de données de ce disque dur?
Q7 (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 Les premiers ordinateurs conçus autour de la première guerre mondiale ne contenaient pas de transistors, mais des tubes à vides ou des relais.
B Le BIOS, un programme écrit en mémoire volatile, contient le test initial d’un
ordinateur, des fonctions de base pour accéder aux périphériques et une fonction pour lancer un système d’exploitation.
C Lors du démarrage de votre ordinateur, le chipset initialise la table des vecteurs d’interruption pour que vous puissez accéder aux périphériques avec l’instruction CALL. En effet CALL permet de changer IP ou CS : IP.
D Dès que l’interruption #X survient, CS : IP est immédiatement changé selon les valeurs à l’adresse 4*X, peu importe le contexte des instructions en cours.
E Programmer en assembleur offre quelques avantages par rapport à la programmation en langage de haut niveau : on peut optimiser la taille et la vitesse d’exécution d’un code, on peut réaliser plus de fonctionnalités en moins de temps et on peut accéder au matériel plus facilement.
F Avant compilation, l’éditeur de lien (linker) remplace certaines directives d’assembleur par du code ou dispose le code en fonction de celles-ci.
G Les registres sont dans le CPU. Les instructions sont dans la mémoire. Les variables sont dans la mémoire. La pile est dans le CPU. Le code de démarrage de l’ordinateur est dans le CPU. La table des vecteurs d’interruption est dans la mémoire.
H Un système possède 4 lignes de données et 8 lignes d'adresse. Il peut donc adresser 32 bytes d'informations. Afin de doubler sa capacité, il faudrait avoir 16 lignes d'adresse et 8 lignes de données.
I Les microprocesseurs d'architecture RISC possèdent un grand nombre de registres en raison de leur jeu d'instruction simple, ce qui a pour conséquence qu'ils doivent faire beaucoup d'accès mémoire.
J Dans un fichier source, les directives "ifdef" sont exécutées après la compilation de la source.
Q8 (3 points) : Un microprocesseur exécute des instructions beaucoup plus vite qu’un disque dur peut en fournir. Quelles composantes de votre ordinateur ont été ajoutées afin de fournir des instructions au microprocesseur à la vitesse à laquelle il les exécute?
Q9 (8 points) : En binaire, faire un modulo 2n est facile. Il faut simplement mettre tous les bits d’un nombre à 0, sauf les n bits les moins significatifs. Par exemple pour effectuer BCDEh%8, il suffit de garder les trois derniers bits de BCDEh (8 = 23) et de mettre tous les autres à 0, c’est-à-dire BCDEh%8 = 0006h (BCDEh = 1011 1100 1101 1110b, BCDEh%8 = 0000 0000 0000 0110b).
Sans faire de division, écrivez une fonction en assembleur 8086 qui fait le modulo 2n d’un nombre. Cette fonction reçoit deux paramètres : un nombre et la puissance de 2 utilisée pour faire le modulo (n). Elle retourne le modulo du nombre. Écrivez aussi un exemple d’appel de cette fonction.
Autres exigences :
- La fonction DOIT être commentée - La fonction doit être propre
- Les paramètres d’entrée et de sortie sont sur 16 bits
- La méthode de passage des paramètres est laissée à votre discrétion, mais le passage de paramètre par registres, le plus simple, est recommandé.
Note : Une liste des instructions du 8086 est disponible en annexe.
Indice : Pour faire 2n, les instructions de rotation ou de translation de bits sont très utiles.
Q10 (2 points bonus) :
a) Que fait le programme suivant si on commence l’exécution à l’étiquette In?
b) Quel problème surviendra après exécution du programme pendant un temps très long?
In: lea ax, Out lea bx, Boucle push ax push bx ret
Boucle: lea ax, In push ax ret Out: ret
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 byte Effectue AX = AL*byte, 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.
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.
STI Met à 1 le drapeau des interruptions.
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