Spécialité : Electrique Module : Microprocesseur Année universitaire : 2016 – 2017 Solution de la Série de TD N° : 3+4 Programmation du Microprocesseur 8086 en Assembleur 1. Dans l’extrait de programme suivant, préciser pour chacune des instructions le mode d’adressage : Instruction MOV AL, [000BH] Mode d’adressage ADD AL, C4H Mode immédiat MOV [BX], 00H SUB AL, [BX + SI] Mode direct Mode indirect basé Mode indirect basé-indexé Ecrire des programmes en assembleur 8086 qui permettent de : 2. Evaluer l’expression suivante et stocker le résultat en mémoire à l’adresse 0300H : Y = 2x2 + 3x - 1. Tel que x est un nombre positif (1 octet) stocké en mémoire à l’adresse 0100H. Le programme : MOV AL, [0100H] MUL [0100H] MOV BX, 2 MUL BX XCHG AX, BX MOV AX, 3 MUL [0100H] DEC AX ADD AX, BX ADC DX, 0 MOV [0300H], AX MOV [0302H], DX HLT Solution de la Série de TD N° : 3 3. Compter le nombre d’éléments nuls dans un tableau de 100 octets stockés en mémoire à partir de l’adresse 200H. Le résultat sera stocké dans la case mémoire d’adresse 400H. L’organigramme : Début CX ← 100 SI ← 200H BL ← 0 Oui [SI] = 0 BL ← BL + 1 SI ← SI + 1 CX ← CX - 1 Non CX = 0 Oui [400H] ← BL Fin Le programme : MOV CX, 100 MOV SI, 200H B1: MOV BL, 0 CMP [SI], 0 JNE Next INC BL Next: INC SI LOOP B1 MOV [400H], BL HLT Par : A. BENMAKHLOUF Non Solution de la Série de TD N° : 3 4. Compter le nombre de 1 dans un mot binaire de 16 bits (contenu dans AX). Le résultat sera stocké dans la case mémoire d’adresse 1200H. L’organigramme : Début CX ← 16 BL ← 0 Décaler AX à droite d’une position Oui CF = 1 BL ← BL + 1 CX ← CX - 1 Non CX = 0 Oui [1200H] ← BL Fin Le programme : MOV CX, 16 MOV BL, 0 B1: SHR AX, 1 JNC Next INC BL Next: LOOP B1 MOV [1200H], BL HLT Non Solution de la Série de TD N° : 3 5. Trier par ordre croissant (du plus petit au plus grand) les 50 éléments d’un tableau stocké en mémoire à l’adresse 300H. L’organigramme : Début CX ← 50 SI ← 300H AL ← [SI] Empiler CX CX ← CX - 1 Non CX < 1 BX ← CX Oui Non AL > [BX + SI] AH ← [BX + SI] [SI] ← AH [BX + SI] ← AL AL ← AH CX ← CX - 1 Non Oui CX = 0 SI ← SI + 1 Dépiler CX CX ← CX - 1 Oui Fin Le programme : MOV CX, 50 MOV SI, 300H B1: MOV AL, [SI] PUSH CX DEC CX CMP CX, 1 JL Fin CX = 0 Non Oui Solution de la Série de TD N° : 3 B2: MOV BX, CX CMP AL, [BX + SI] JNG Next XCHG AL, [BX + SI] MOV [SI], AL Next: LOOP B2 INC SI Fin: POP CX LOOP B1 HLT 6. Calculer la somme des nombre entiers pairs (de 0 à 100) et stocker le résultat dans le registre BX. Calculer la somme des nombre entiers impairs (de 0 à 100) et stocker le résultat dans le registre DX. Le programme doit utiliser une seule boucle. L’organigramme : Début CX ← 100 BX ← 0 DX ← 0 AX ← 1 AX ← AX et CX Oui AX = 0 Non DX ← DX + CX BX ← BX + CX CX ← CX - 1 Non CX = 0 Oui Fin Le programme : MOV CX, 100 MOV BX, 0 MOV DX, 0 B1: MOV AX, 1 Solution de la Série de TD N° : 3 AND AX, CX JZ Pair ADD DX, CX JMP Next Pair: ADD BX, CX Next: LOOP B1 HLT 7. Calculer le factoriel d’un nombre entier n de 8 bits (stocké en mémoire à l’adresse 0210H) noté n!. Le résultat doit être stocké en mémoire à l’adresse 0220H. - Quelle peut être la taille du résultat ? Pour calculer le factoriel d’un nombre on effectue des opérations de multiplication, le résultat pourra être un nombre de 32 bits. - Quelle condition doit satisfaire le nombre n pour qu’il n’y ait pas dépassement de cette taille ? Le plus grand nombre qu’on peut représenter sur 32 bits est 232 – 1 = 4294967295. Pour ne peut dépasser la taille de 32 bits, il faut que : n! ≤ 4294967295. C’est-à-dire : n ≤ 11. - Il faut prendre en considération le cas 0! = 1. L’organigramme : Début AX ← [210H] Non AX = 0 Oui CX ← AX - 1 Non DX : AX ← AX * CX AX ← 1 CX ← CX - 1 DX ← 0 CX = 0 Oui [220H] ← AX [222H] ← DX Fin Solution de la Série de TD N° : 3 Le programme : MOV AX, [0210H] MOV DX, 0 CMP AX, 0 JNZ NONZERO MOV AX, 1 JMP FIN NONZERO: MOV CX, AX DEC CX FACTORIAL: MUL CX LOOP FACTORIAL FIN: MOV [0220H], AX MOV [0222H], DX HLT