Vous êtes sur la page 1sur 3

Ordinateurs et Systmes d'Exploitation Exercices  IX

1. Ecrire un programme assembleur 80x86 capable de mesurer la longueur de la plus grande srie d'octets identiques conscutifs dans une suite d'octets donne. Le registre AX pointe initialement vers cette suite d'octets, dont la longueur est donne dans CX. La longueur de la plus grande srie trouve sera place dans le registre DX en n d'excution.
Solution

Pour pouvoir mesurer la longueur d'une suite d'octets identiques conscutifs, il est ncessaire de mmoriser la valeur commune de ces octets, et le nombre d'octets possdant cette valeur qui ont dj t parcourus depuis le dbut de la suite. On choisit de retenir ces deux valeurs, respectivement, dans les registres BL et AX. Pour rsoudre le problme, il reste alors mettre jour la valeur de DX lorsque BL change de valeur, ainsi qu'en n d'excution du programme.
SECTION .text cmp cx, 1 ja init mov dx, cx ret mov bp, ax mov dx, 0 mov ax, 1 dec cx mov bl, [bp] inc bp cmp bl, [bp] jne max inc ax jmp suite cmp dx, ax jae reset mov dx, ax mov ax, 1 mov bl, [bp] loop boucle cmp dx, ax jae fin. mov dx, ax ret

init:

boucle:

max: reset: suite:

fin:

2. Ecrire un programme de tri en assembleur 80x86. Le registre BX pointe initialement vers une suite d'octets reprsentant des nombres entiers signs sur 8 bits (il y a donc un nombre reprsent par octet). La longueur de cette suite est donne dans CX et peut tre suppose non nulle. En n d'excution, les octets de la suite doivent tre rangs par ordre croissant. 1

L'ecacit n'tant pas une priorit dans le cadre de ce problme, un nombre d'oprations eectues qui serait quadratique en fonction du nombre d'octets traiter est considr acceptable.
Remarque : Solution

On peut commencer par dplacer en tte de la suite l'octet de plus faible valeur. Il reste ensuite trier la sous-suite compose de tous les autres octets de la suite originale. Cela revient augmenter BX d'une unit, dcrmenter CX, et recommencer l'opration. La procdure peut tre arrte lorsque CX devient infrieur ou gal 1.
SECTION .text tri: mov al, [bx] mov si, 1 boucle: cmp si, cx jae next_bx cmp al, [bx + si] jle next_si xchg al, [bx + si] mov [bx], al next_si: inc si jmp boucle next_bx: inc bx loop tri ret

3. Une entreprise propose un prix dirent pour un produit en fonction de la quantit demande : Les 100 premiers produits commands par un client cotent toujours 25 euros pice, alors que les suivants ne cotent plus que 20 euros. Cette entreprise souhaiterait connatre la somme totale facture ses clients en fonction de leurs commandes. On demande d'crire un programme assembleur 80x86 eectuant ce calcul. Le registre BX pointe initialement vers un tableau d'octets qui reprsentent chacun un nombre de produits commands (en reprsentation binaire non signe). Le nombre de commandes est donn dans le registre CX. Le programme doit renvoyer la somme totale facture aux clients dans le registre AX. Exemple : Si le tableau contient les trois valeurs 50, 220 et 123, la somme totale vaut (50 25) + (100 25 + 120 20) + (100 25 + 23 20) = 9110.
Solution

Aprs avoir trait le cas o CX est nul, on met zro le registre DX qui servira d'accumulateur. On parcourt alors les direntes commandes, on compare chaque nombre de produits commands la valeur 100, et on ajoute DX le montant de la commande, calcul en fonction du rsulat de la comparaison. En n d'excution, on transfre enn le contenu de DX vers AX.
SECTION .text cmp cx, 0 jne init mov ax, 0 ret mov dx, 0

init:

mov al, [bx] cmp al, 100 ja beaucoup mul byte 25 jmp suite beaucoup: add dx, 2500 sub al, 100 mul byte 20 suite: add dx, ax inc bx loop boucle mov ax, dx ret

boucle:

Vous aimerez peut-être aussi