Ministère de l’Enseignement Supérieur et de la Recherche Scientifique Université Dr Tahar Moulay de Saïda Faculté des Sciences et de la Technologie Département de Mathématique et d’Informatique ème Licence : 2 Année Informatique
Année Universitaire : 2011/2012
UE 7 : Architecture des Ordinateurs
Corrigé Examen Final (Semestre 3) Questions de cours : (7pts) 1. Citez les registres utilisés pour le mode d’adressage indirect ?
1,5pts
BX, BP, DI, SI 2. Quel est le mode d’adressage utilisé dans cette instruction ? Est ce qu’il est autorisé pour ce genre de registre ? Si non corrigez l’instruction ? 1,5pts Adressage Immédiat, non il n’est pas autorisé autorisé pour les registres de segments, segments, MOV AX, 01F5H ; MOV DS, AX
MOV DS, 01F5H 3. Nous voulons changer les bits 5 et 12 du registre AX à zéro sans changer les autres, donnez l’instruction assembleur qui convient ? AND AX, 1111011111101111
1pts
4. Dans une architecture Intel, Quel est l’ordre de lecture/écriture d’un Word mémoire ? Comment appelle-t-on ce type d’accès ? Donnez un exemple de transfert mémoire à registre explicitant ce type. 1,5pts L’ordre de lect/ecriture : en premier l’octet en haut, le deuxième l’octet en bas ; little-endian AX
1F
00100h 00101h
2B
2 1
B F
5. Quel registre registre sollicite l’instruction "LOOP étiquète" ? Expliquez ce procéder. procéder.
1,5pts
Loop sollicite le registre CX ; elle déc CX puis fait le test avec 0 si =0 sortir de la boucle sinon se brancher vers étiquette.
Exercice n°1 : (03pts) Soit les instructions suivantes :
MOV AL, 112 MOV AH, 68 SUB AH, AL Réalisez cette opération en binaire et donnez le contenu du registre AH ? Les opérations signés sont représentées en complément à 2 : A-B= A+ Cà2(B) 112= 0111 0000
Cà2(112) = 1001 0000
1pts
68= 0100 0100
0100 0100
1pts
68-112= 68+ 68+ Cà2(112)= 0100 0100 + 1001 0000 = 1101 0100 0100 = D4H
1pts
Exercice n°2 : (05pts) Soit l’algorithme en langage évolué : n := 28 som_div := 1 i := 2
// n est un nombre entier // som_div est la somme des diviseurs de n // i représente les diviseurs de n
REPETER SI ( n mod i = 0) ALORS som_div := som_div + i FINSI i := i + 1 JUSQU’À ( i = n – 1 ) SI som_div = n
Page 1/3
ALORS ecrire ('parfait') SINON ecrire('non parfait') FINSI -
Traduire l’algorithme ci-dessus en Assembleur ?
code segment assume cs:code, ds:donnee debut : mov ax, donnee mov ds, ax mov bh, 2 mov cx, 1
;bh va contenir les diviseurs ;CX va contenir la somme des diviseurs ; utiliser uniquement le registre cl et initialiser ch à 0
repeat: mov ax, nb div bh cmp jne add nondiv: inc cmp
ah, 0 nondiv cl, bh bh bh, 27
jne repeat mov ax, Nb cmp cx, ax je parf mov dx, mov ah, int 21h jmp fsi parf: mov dx, mov ah, int 21h
;division 16bit/8bits résultat dans AL, le reste dans AH ;si reste =0 ajouter bh aux disviseurs (CL) ;faire le test du reste de la division ah ;se branher vers etiq nondiv pour un non diviseur ;si reste=0 ajouter nbre dans bh au diviseur dans CL ;incrémenter le diviseur ;comparer diviseur avec nb-1 pour éviter de calculer ;nb div 2 et faire les choses simple ;si bh<>27 aller vers début boucle repeat ;charger nb dans AX ;cl contient la somme des diviseurs et CH est vide donc ;CX contient la somme des div pour pouvoir tester 2 reg ;de 16bits
offset msg2 09h offset msg1 9h
fsi: mov ah, 4ch int 21h code ends donnee segment nb dw 28 msg1 db "Nombre Parfait", '$' msg2 db "Nombre non Parfait", '$' donnee ends end debut Exercice n°3 : (05pts) Ecrire le code (uniquement les suites d’instructions) Assembleur pour faire la somme de dix (10) éléments d’un tableau. Le premier étant rangé à la case mémoire ayant l’adresse "0F68H" ? (chaque nombre est sur un octet et la somme peut dépassée 255)
mov bx, 0F68H mov cx, 10
;BX contient l’adresse du 1er élément ;CX (compteur) contient le nombre d’élément du tableau Page 2/3
mov ax, 0 mov dx, 0
;AX contient la somme et initialisé à 0 ;initialiser DX à zéro, le sous-registre DL va contenir ;l’élément lu de la mémoire, DH restera toujours zéro et sera ;utile pour l’addition des 2 registres AX et DX
repeat: mov dl, [bx] add ax, dx inc bx loop repeat
;pour lire 1 seul octet de la mémoire ;DH étant à zéro faire la somme de 2 registre 16bits ;incrémenter BX pour lire l’elt suivant du tableau
Page 3/3