Aotds
Aotds
Aotds
L3 Mention Informatique
Jean-Michel Richer
Architecture des Ordinateurs
jean-michel.richer@univ-angers.fr 2015/2016
Travaux Dirigés
1 Représentation de l’information
En informatique, on doit pouvoir représenter des nombres entiers naturels ou relatifs ainsi que
des nombres à virgule. On distingue au moins 4 types de représentations :
– la représentation binaire naturelle utilisée pour représenter les entiers naturels,
– la représentation binaire signée
– la représentation binaire en complément à deux utilisée pour représenter les entiers relatifs
– la représentation en virgule flottante utilisée pour représenter les réels
où les xi sont des coefficients prenant leurs valeurs dans l’intervalle 0, 1, . . . , B − 1.
Exercice 1 - Trouvez l’équivalent décimal des nombres suivants :
• 1010102 , 100112
• 2013 , 11113
• 4218 , 7328
• A016 , F F16
Exercice 5 - Quels sont les plus grands entiers naturels que l’on peut représenter avec 8, 16 ou 32
bits ?
Exercice 6 - Calculer la somme des nombres signés suivants. Que remarquez vous ?
• 0000.01112 + 0000.01012
• 0000.01112 + 1000.01012
Exercice 8 - Calculer la somme des nombres en complément à deux suivants. Que remarquez
vous ?
• 0000.01112 + 0000.01012
• 0000.01112 + 1000.01012
• 0000.00112 + 1111.10112
• 0100.00002 + 0100.00012
Exercice 9 - Calculer le produit des nombres en complément à deux suivants. Que remarquez
vous ?
• 7×5
• 7 × −5
• 48 × −2
• 48 × −3
Exercice 10 -
– comment multiplier simplement un nombre binaire par 2, 4, 8 ou 2n ?
– comment diviser simplement un nombre binaire par 2, 4, 8 ou 2n ?
1.4 Représentation en virgule flottante
31 30 25 23 22 0
S Exposant décalé Mantisse tronquee
Exercice 11 - Représentez 133, 87510 en norme IEEE 754. Pour ce faire procédez par étapes :
– transformez 133, 875 en base 2.
– normalisez le résultat en supprimant le premier chiffre 1
– ajoutez 127 à l’exposant
– codez le résultat final sur les 32 bits de la norme IEEE
Exercice 12 - Trouvez à quel nombre réel correspond la représentation IEEE 754 : 42 C8 40 0016
N 2N N 2N N 2N
0 1 8 256 16 65536
1 2 9 512 20 1.048.576
2 4 10 1024 31 2.147.483.648
3 8 11 2048 32 4.294.967.296
4 16 12 4096
5 32 13 8192
6 64 14 16384
7 128 15 32768
TABLE 1 – Puissances de 2
if (a <= b) {
i1;
} else {
i2;
}
2. traduire en assembleur x86 le code C suivant (on supposera que les variables i, n et sum
sont des variables entières.
sum=0;
for (i = 0; i < n; i++) {
sum = sum + i;
}
3. traduire en assembleur x86 le code C suivant :
sum=0;
while ((i > 10) && (i <= n)) {
sum = sum + i;
++i;
}
4. traduire en assembleur x86 le code C suivant :
sum=1;
while ((i % n) ==0) || (i == 3)) {
sum = sum * i;
++i;
}
Exercice 17 - Comment multiplier efficacement sur un 8086, la valeur contenue dans le registre
AX par 10 sans utiliser l’instruction mul ? On rappelle que mul r16 utilise 118 à 133 cycles sur
un 8086.
Exercice 20 - Ecrire un programme assembleur nasm pour processeur x86 et interfacé avec le
langage C qui récupère les arguments en ligne de commande du programme et les affiche en
utilisant la fonction printf du langage C.
Exercice 21 - Ecrire un programme en langage C qui étant donné un tableau de MAX entiers, réalise
l’initialisation du tableau par des valeurs aléatoires comprises entre 0 et 20, puis affiche à l’écran
la somme des valeurs par appel à une fonction assembleur :
on soustrait q à p et on garde le bit le plus significatif que l’on propage (bit 31 = bit de signe, utiliser
l’instruction sar r32,imm8). A partir de ce moment, il suffit de calculer : (p ∧ r) ∨ (q ∧ ¬r)).
Exercice 23 - Réaliser le dépliage de boucle par 4 (loop unrolling) sur le code C suivant :
void f(int *v, int *w, int k, int n) {
for (int i=0; i<n; ++i) {
v[i] += w[i] * k;
}
}
Traduire en assembleur, puis donner une version en utilisant les instructions SSE suivantes
dont on aura pris soin de consulter la documentation afin de comprendre leur comportement :
– movd
– pshufd
– pmulld
– paddd
– movdqu
– movdqa
Exercice 24 - Traduire en assembleur x86 version 64 bits le code C suivant qui correspond au
produit de deux matrices carrées de dimension N (constante) :
void prod(int a[N][N], int b[N][N], int c[N][N]) {
int i,j,k;
for (i=0;i<N;i++) {
for (j=0;j<N;j++) {
int sum=0;
for (k=0;k<N;k++) sum+=a[i][k]*b[k][j];
c[i][j]=sum;
}
}
}
Exercice 25 - Donner le code assembleur du calcul suivant :
√ 1
X + Y + Y 2 + tan( X−Y )
(X + Y ) × sin(X − Y )
Exercice 27 - Coder la fonction suivante en assembleur classique puis donner une version qui
utilise les registres SSE.
int chr_replace(char *src, char *dst, int n, char c, char d) {
int changes=0;
for (int i=0; i < n; ++i) {
if (src[i] == c) {
dst[i] = d;
++changes;
} else {
dst[i] = src[i];
}
}
return changes;
}
Exercice 28 - Démontrez à l’aide de tables de vérité, les équivalences suivantes :
(a) XY Z = X̄ + Ȳ + Z̄
(b) X + Y Z = (X + Y )(X + Z)
(c) X + X̄Y = X + Y
Exercice 31 - Soient deux fonctions booléennes E et F de trois variables dont les tables de vérité
sont données. Exprimez E et F en fonction de X, Y, Z et simplifiez ces expressions.
X Y Z E(X, Y, Z) F (X, Y, Z)
0 0 0 1 0
0 0 1 1 0
0 1 0 1 1
0 1 1 0 0
1 0 0 1 0
1 0 1 0 0
1 1 0 0 1
1 1 1 0 1
Exercice 33 - Implantez les circuits suivants avec des portes NAND. Peut-on les simplifier et
pourquoi ?
(a) W X̄ + W XZ + W̄ Ȳ Z̄ + W̄ X Ȳ + W X Z̄
(b) XZ + XY Z̄ + W X̄ Ȳ
Exercice 34 - Imaginer un moyen d’échanger deux variables A et B sans utiliser une troisième
variable ou un registre intermédiaire (pensez à l’instruction XOR).
Exercice 35 - Soit une machine dotée d’un bus d’adresses de 10 bits et d’un bus de données de 8
bits. Cette machine dispose également d’une mémoire cache à accès direct de 8 entrées.
1. quelle taille mémoire le processeur peut-il adresser ?
2. quelle est la taille du cache ?
3. on accède successivement aux adresses suivantes :
Adresse Donnée Adresse Donnée
0000000000 D1 0000111000 D7
0000010100 D2 0100110010 D8
0000110110 D3 0100111000 D9
0001110000 D4 1100110111 D10
0000001100 D5 0010110011 D11
0000100100 D6 1100110010 D12
Déterminer l’état du cache.
Simuler le fonctionnement de cet algorithme pour les accès successifs à des valeurs dans les
deux cas suivants :
– Cas 1 : a,b,c,d,e,b,c,a,f,a,b,c
– Cas 2 : a,b,c,d,e,a,b,c,d,f,a,b,c,d
Que remarquez-vous ?