IFT-17583

 

Structure interne des ordinateurs

 

FAQ

 

 

 
Nous répondons ici aux meilleures questions posées par les étudiants du cours. Nous soulignons aussi les erreurs du livre ou du supplément.

 

Quelle calculatrice puis-je utiliser lors des examens ?

Voici les modèles approuvés par la Faculté des Sciences et de génie :

Hewlett Packard HP-20-S, HP-32S2
Texas Instrument TI-30Xa, TI-36X
Sharp EL-531L, EL-546-L, EL-5120
Casio FX-280

Pour l'exercice 3.2, je trouve comme réponse 626350. La réponse donnée à la p. 107 est 1454728. Où est l'erreur ?

Réponse :

La réponse à l'exercice 3.2 du supplément doit se lire 1454728. Pour écrire un nombre binaire en octal, il faut grouper les bits trois par trois à partir de la droite et non à partir de la gauche.

Dans le volume, on dit que la soustraction binaire se fait avec le complément à 2. Pourquoi la faites vous autrement dans les exemples ?

 

Réponse :

La méthode du complément à 2 convient bien pour un ordinateur parce qu'elle permet une simplification des circuits logiques. Cependant, dans des opérations comme la division binaire à la main, elle ne conviendrait pas du tout. On la fait donc comme la soustraction en décimal, avec des emprunts au chiffre de gauche quand le bit à soustraire (celui du bas) est plus grand que celui du haut. Voyez la question suivante.

Erratum

la page 47 du livre, l'énoncé de l'exercice 8 devrait se terminer par une représentation analogue à celle décrite dans l'exercice 5e. 

J'ai de la difficulté avec la soustraction binaire. Comment fait-on?

Supposons qu'on a à soustraire 11002 - 01112 (12 - 7 = 5) :

 1100
-0111
______
 0101

Voici le raisonnement.

1e colonne de droite: 0 - 1? On emprunte 1 (qui vaut 2) à la colonne de gauche suivante. On a alors 102 - 1 = 2 - 1 = 1.

2e colonne de droite : 0 - 1 - retenue précédente = 0 - 2? On emprunte encore 1 à la colonne de gauche suivante. On a alors 102 - 1 - 1 = 2 - 1 - 1 = 0.

3e colonne de droite : 1 - 1 - retenue précédente = 1 - 2? On emprunte encore 1 à la colonne de gauche suivante. On a alors 112 - 1 - retenue précédente = 3 - 1 - 1 = 1.

4e colonne de droite : 1 - 0 - retenue précédente = 1 - 0 - 1 = 0.

Résultat : 01012

Voyez l'animation à la page Support/Arithmétique binaire.

 

Je n'arrive pas à faire la soustraction binaire en complément à 2. Je fais 20 - 7 et je n'arrive pas à la bonne réponse

10110 - 111 = 10110 + 000 (complément à 1 de 7) + 1 = 10111 au lieu de 1101. Quelle est l'erreur?

Réponse :

Le complément à 2 doit se faire sur un nombre déterminé de bits et le nombre de bits doit être le même pour les deux opérandes.
La façon correcte serait, avec des motifs de 8 bits :
00010110 - 00000111 = 00010110 + 11111001 = (1)00001101.

Pourquoi l'exposant est-il biaisé en virgule flottante IEEE

Réponse :

L'exposant est biaisé pour que la représentation de 0 soit 00000000. En effet, le plus petit exposant possible en simple précision est -127. Une fois biaisé en ajoutant 127, il devient 0. Ainsi, pour la virgule flottante de simple précision, 0 serait 1.0 x 2-127.

Contradiction dans la virgule flottante

Ë la page 40 du livre, on dit que la mantisse est un nombre purement fractionnaire, i.e. de la forme M = 0,f. Ë la page 13 du supplément, on dit que la mantisse est de la forme M = 1,f. Qui a raison ?

 

Le livre n'utilise pas la norme IEEE 754 pour la virgule flottante. Il ne fait que la mentionner à la page 43. Le supplément utilise seulement la norme IEEE 754 parce que c'est celle qui est la plus répandue de nos jours. En effet, elle est utilisée dans pratiquement tous les micro-ordinateurs de la plan*te, Mac, PC, SUN, HP, etc. et dans les langages de haut niveau qu'ils utilisent : C/C++, Java, etc.

Erratum

Il y a une erreur dans le livre à la p 88. À la figure 5.16, S1 et S3 sont inversés dans le tableau.

Qu'est-ce que le XOR? À quoi ça sert ?

Réponse :

Dans la fonction OU (OR), le résultat est 1 si l'une ou l'autre des entrées est 1 ou si les deux entrées sont 1. Par contre, on a souvent besoin d'une fonction XOR dans laquelle le résultat est 1 si l'une ou l'autre des entrées est 1 mais pas les deux. Le XOR est utile dans l'addition de deux bits :

0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 0

Le XOR est donc essentiel pour réaliser les fonctions arithmétiques au moyen de fonctions logiques.

On remarque que la sortie du XOR est 1 quand les deux bits sont différents et 0 quand ils sont égaux. C'est donc un détecteur d'égalité (ou d'inégalité).

Si A = B, alors .

Les processeurs ont souvent une instruction XOR. Elle est utilisée, entre autres,  pour inverser des bits sélectivement. Par exemple si un registre contient le nombre suivant : 0110 1110 et qu'on fait le XOR avec l'opérande 1111 0000, on obtiendra 1001 1110. On fait le XOR de chaque bit du registre avec le bit correspondant de l'opérande. Si le bit de l'opérande est 0, il n'y a pas de changement, puisque 0 XOR 1 = 1 et 0 XOR 0 = 0.
En revanche, s'il est 1, il y a inversion, puisque 1 XOR 1 = 0 et que 1 XOR 0 = 1.

Elle est aussi utilisée pour mettre un registre à 0. En effet, comme la sortie du XOR est 0 si les deux opérandes sont égaux, il est clair que A XOR A = 0.

Je ne sais pas lire les boucles dans les tables de Karnaugh. Je ne vois pas de manière visible les expressions simplifiées. Est-ce qu'il faut lire les lignes ou les colonnes ou les boucles qui parfois ont des intersections
 
Réponse :

Il faut simplement observer quelles variables sont constantes pour tous les 1 (ou les x) d'une boucle. Par exemple, dans W, ci-dessous, pour la boucle du bas, on
observe que A est toujours 1, tantis que B peut être 1 ou 0. La boucle ne peut donc pas dépendre de B. De plus, pour cette boucle, n'importe quelle valeur de C ou de
D est possible. Elle ne peut donc pas dépendre de C ou de D. Donc elle vaut A.

Même chose pour la petite boucle du centre. À gauche on observe que B est toujours 1, mais que A peut être 0 ou 1. Elle dépendra donc de B seulement. En haut, on voit que c'est D qui est toujours 1. Cette boucle vaut donc BD.

Finalement, pour la boucle de droite, B est toujours 1 et en haut on observe que c'est ici C qui est toujours 1. La boucle vaut donc BC.

Le résultat global est donc W = A + BD + BC.

On ne s'occupe pas des intersections. Dans la solution finale, on peut factoriser si on veut : W = A + B.(C + D) pour sauver une porte.

Qu'est-ce qu'un code 2-4-2-1 ou un code 5-4-2-1 ?

On trouve la table de vérité du code 2-4-2-1 à la page 89 du livre et la table de vérité du code 5-4-2-1 à la page 110.

Le code 2-4-2-1 est un code de 4 bits permettant de compter de 0 à 9. Le poids des 4 bits est respectivement 2, 4, 2, et 1.

Si les bits sont numérotés b3, b2, b1, b0, la valeur d'un nombre est donnée par :

2 x b3 + 4 x b2 + 2 x b1 + 1 x b0

Ce n'est pas un code univoque, i.e. il y a plusieurs façons de coder chaque nombre, puisque 2 bits ont le même poids. La convention adoptée dans ce code est que le bit le plus significatif est 1 si le nombre à représenter est supérieur ou égal à 5. Les trois autres bits sont codés en binaire naturel. Le bit supplémentaire I sert à indiquéer les combinaisons valides.

Le code 5-4-2-1 est similaire, sauf que le premier bit a un poids de 5. Ici encore, ce bit est 1 si le nombre est spérieur ou égal à 5. Les autres bits sont en binaire naturel.

Si les bits sont numérotés b3, b2, b1, b0, la valeur d'un nombre est donnée par :

5 x b3 + 4 x b2 + 2 x b1 + 1 x b0

Il est possible d'imaginer d'autres codes de ce type, par exemple 3-3-2-1, 2-4-4-1, etc.

À la page 93 du livre, on lit S(t+1) = f[ Q(t+1) ], mais dans le transparent 167, on lit S(t) = f[ Q(t) ], et à la page 94 du livre, on lit S(t+1) = f[ E(t), Q(t) ], tandis que dans le transparent 168, on lit S(t) = f[ E(t), Q(t) ]. Qui a raison ?

Les transparents. Dans le second cas, en particulier, S est une fonction combinatoire de E(t) et de Q(t), il s'agit donc de S(t) et non de S(t+1). Dans le premier cas, S(t+1) = f[ Q(t+1) ] est équivalent à S(t) = f[ Q(t) ] puisqu'ici encore, c'est une fonction combinatoire, donc indépendante du temps.

Le long des arcs représentant les transitions, l'information inscrite représente donc :

les entrées présentes causant la transition / les sorties présentes avant la transition.

Aux pages 114 et 115 du livre, on a des entrées 0/1 aux pattes d'un bistable RS. Pourquoi ?

Supposons que, comme dans la première rangée, Q+ = Q = 0. Un bistable RS qui est dans l'état 0 restera dans l'état 0 si les deux entrées S et R sont 0. C'est l'état stable. La sortie sera également 0 si S = 0 et R = 1. C'est un "Reset", mais la sortie est déjà 0. Donc on peut écrire S = 0 et R = 0/1 comme entrée pour le bistable (on pourrait écrire x au lieu de 0/1). C'est un état indifférent qui pourra apporter une simplification lors de l'étape suivante de simplification du circuit à l'aide de tables de Karnaugh.

De la même façon, si Q+ = Q = 1, autrement dit, le bistable est dans l'état 1 et on veut qu'il reste dans l'état 1, on peut laisser S = 0 et R = 0, c'est l'état stable, ou donner une commande "Set" en mettant S = 1 et R = 0. Cette commande n'aura pas d'effet, puisqu'elle met à 1 une sortie qui est déjà 1. Donc dans ce cas, les entrées appropriées sont R = 0 et S = 0/1.

À la page 95 du livre, on nous présente le bistable RS avec entrée C. On nous donne l'équation du circuit comme étant , mais il n'y a pas d'entrée R. Est-ce la figure ou l'équation qui est incorrecte ?

C'est la figure. Le diagramme correct est :

Voir transparent 174 pour le circuit d'un tel bistable.

À la page 95 du livre, on nous présente le bistable T comme ayant une seule entrée T qui la fait basculer quand elle est 1. À la page 99, on donne la réalisation d'un tel bistable au moyen d'un bistable RS avec entrée C. Pourtant, à la page 116 du livre on nous présente un circuit comprenant trois bistables T ayant une entrée T et une entrée C distinctes.

En effet, il semble y avoir un problème. C'est pour cette raison que dans les transparents (no. 176) on distingue deux types de bistable T : le premier, qu'on peut qualifier de bistable T asynchrone, n'a qu'une entrée T qui fait basculer le bistable chaque fois qu'elle devient 1, et le bistable T synchrone, qui a une entrée T et une entrée C. Quand T = 0, le circuit ne bascule pas, quand T = 1, le circuit bascule à chaque impulsion d'horloge.

 

À la page 115 du livre, l'entrée Ci-1 est connecté sur la sortie Ci du bistable. Comment est-ce possible ?

Attention, Ci-1 n'est pas une entrée, mais plutôt la sortie de l'état présent Ci-1!!!

À la page 117 du livre, pourquoi a-t-on T0 = 0 à la troisième ligne, alors que Q0+ est 1?

Il s'agit d'un bistable T. Un tel bistable bascule à chaque coup d'horloge quand T est 1 et ne bascule pas quand T est 0. Donc si on veut que Q+ = Q, on applique T = 0 comme entrée, que ce soit Q+ = Q = 1, ou Q+ = Q = 0.

Par contre, si Q = 0 et qu'on veut avoir Q+ = 1, ou si Q = 1 et qu'on veut avoir Q+ = 0, alors il faut appliquer T = 1 comme entrée.

Qu'est-ce que la parité ?

La parité est un bit qu'on ajoute à un message pour détecter les erreurs. Elle peut être paire ou impaire et le récepteur et le transmetteur doivent s'entendre sur le protocole.

Parité paire : la valeur du bit de parité est telle que le nombre total de 1 dans le message, incluant le bit de parité, est pair.

Parité impaire : la valeur du bit de parité est telle que le nombre total de 1 dans le message, incluant le bit de parité, est impair.

À la réception, on détecte si la parité est la bonne. S'il y a eu une erreur, alors la parité sera incorrecte, puisqu'un bit aura changé de valeur.

Pour plus de détails, voir Zanella et Ligier p. 52.

À quoi servent les crochets dans une instruction comme mov ax,[esi] ?

S'il n'y avait pas de crochet, l'instruction dirait de copier esi dans ax. Premièrement, ce n'est pas légal, puisque esi a 32 bits et que ax en a 16. Secundo, ce n'est pas ce qu'on veut faire. On veut copier dans ax le short contenu à l'adresse mémoire qui se trouve dans esi. Le crochet est donc une commande d'indirection : on ne veut pas le contenu du registre, mais le contenu de l'adresse qu'il contient.

J'essaye de compiler avec Masm32 mais il ne se passe rien quand je choisis Assemble ASM File ou Assemble & Link dans le menu Project de QEditor.

C'est exact. Masm32 n'est pas un produit commercial. Il est donc un peu primitif à certains égards. Il faut que votre fichier source soit sur le même disque que Masm32 et que Masm32 soit install* au niveau racine du disque C : C\Masm32. Dans les laboratoires du département, il faut copier votre projet dans C:\Temp. Toutefois, n'oubliez pas de l'effacer à la fin de la session pour ne pas laisser le fruit de votre à travail à d'autres.

Je n'arrive pas à compiler le TP2, j'ai plein d'erreurs de syntaxe telles que :

fatal error A1008: unmatched macro nesting

error A2008: syntax error : cmp

Il faut faire attention de ne pas avoir d'étiquettes portant le nom de mots réservés tels que while, endwhile, if, endif,  etc. Utilisez plutôt des étiquettes telles que si1, finsi1, tantque1, fintantque1, etc.

Solution détaillée du problème 6 du chapitre 8 à la page 191 du livre de Zanella et Ligier.

a) Trouver le résultat à la fin des opérations suivantes :
a. LOAD 3000, XR1
L'adresse est 3000 + (XR1) = 3001. Acc = (3001) = 5
b. LOAD 1000, B1
L'adresse est 1000 + (B1) = 2000. Acc = 2
c. LOAD 1, B2
L'adresse est 1 + (B2) = 2001. Acc = 3
d. LOAD 999, XR2
L'adresse est 999 + (XR2) = 1001. Acc = 1
e. LOAD 1000, IMM
L'adressage est immédiat, c'est donc 1000 qui est placé dans Acc
f. LOAD 0, I
L'adressage est indirect. L'adresse est donc (0) = 1000. Acc = (1000) = 0
g. LOAD 1000, I
Même chose, L'adresse est (1000) = 0 et (0) = 1000, donc Acc = 1000

b) Quelle est la valeur de F après l'exécution du programme suivant :

LOAD 3000 Acc = 4
ADD 2000, XR1
Acc = Acc + (2000 + (XR1)) = Acc + (2001) = 4 + 3 = 7
SUB 2001, B1
Acc = Acc - (2001 +(B1)) = Acc - (3001) = 7 - 5 = 2
MPY 1001, B2
Acc = Acc * (1001 + (B2)) = Acc * (3001) = 2 * 5 = 10
DIV 2000
Acc = Acc / (2000) = 10 / 2 = 5
ADD 1000, IMM
Acc = Acc + 1000 = 1005
SUB 0, I, XR1
Acc Acc - ((0) + (XR1)) = 1005 - 1 = 1004
STORE F
F = 1004

Je n'arrive pas à faire fonctionner les tris du TP3. J'obtiens le message "Ce programme va être arrêté parce qu'il a effectué une opération non conforme".

Certaines versions de Windows 95 et Windows 98 ne supportent pas l'instruction GetInputState(). Ce qui se passe, c'est que cette fonction, dans ces deux versions de Windows, est boguée et modifie ecx et edx. La version de Windows 2000 ne modifie aucun registre.

Vous pouvez :

bullet Soit mettre ces instructions ainsi que le test et le jmp qui suivent en commentaire, sauvegarder votre fichier .asm et faire Assemble & Link. Cela devrait maintenant fonctionner, mais sans possibilité d'interrompre les tris.
Soit faire précéder chaque occurence de GetInputState par push ecx et push edx, et la faire suivre immédiatement de pop edx et pop ecx :

push ecx

push edx

invoke GetInputState

pop edx

pop ecx

test al, al

...

Quels registres dois-je utiliser pour programmer en assembleur ?

Pour des données, vous pouvez utiliser eax, ebx, ecx et edx ou leurs sous-registres ax, bx, cx, dx et al, ah, bl, bh, cl, ch, dl, dh librement. On réserve généralement esi et edi pour des adresses.

Toutefois, il faut garder en mémoire que certaines instructions doivent être utilisées avec des registres spécifiques. C'est le cas de mul, div, loop et de toutes les instructions de chaîne telles que scas, movs, cmps, stos, lods, etc.

Vous ne devez écrire dans esp ou ebp que si vous savez exactement ce que vous faites. Sinon votre programme va se planter.

Dernière mise à jour : 2001-01-29