TP 7 : itérations Programmes réponse
Transcription
TP 7 : itérations Programmes réponse
Architecture des ordinateurs 15/12/06 Architecture des ordinateurs TP 7 : itérations Vous rendrez en fin de séance un compte-rendu de TP, à votre nom comportant : • Les algorithmes précis utilisés, c’est à dire ceux correspondant très exactement à vos programmes; • La manière dont vous associez variable et registre ; • Le texte des programmes en assembleur, commentés et indentés proprement ; • Des exemples d’exécution (obtenus en faisant un copier-coller à partir de la fenêtre DOS). (Un programme sans tests est un programme qui ne compile pas). • Si le programme ne marche pas ou pas complètement, donnez le message que vous obtenez ou précisez l’erreur détectée et non corrigée. Rq 1: écrivez vos programmes petit à petit et testez-les au fur et à mesure. Il vaut mieux en faire moins, mais correctement que plus et faux. 1. Ecrivez un programme qui affiche la suite des n premiers carrés définie par : a. Carre 1 = 1 b. Carre n+1 = Carre n + 2* n + 1 Pour cela vous utiliserez l'algorithme suivant: Variables utilisées: chn: chaîne de 4 caractères lus pour saisir n n: entier positif (entre 0 et 99 ) k: variable d'itération, entier positif carre : entier positif représentant le résultat chcarre : chaîne de caractères utilisée pour écrire carre Algorithme: lire chn définir n carre := 0 pour k := 1 .. n faire carre = carre + 2 * (k-1) + 1 écrire k , ‘ au carre = ‘, carre fpour • Votre programme ne devra pas, dans un premier temps, utiliser l’instruction LOOP. • Votre programme mémorisera toutes le valeurs entières et en particulier les carrés sur un octet. • Utilisez le fichier Nmacros.asm contenant les macros pour lire et écrire des entiers de 1 et de 2 caractères (4 macros différentes) . 2. Modifiez le programme précédent pour utiliser l'instruction LOOP. Exemple d’exécution : Z:\>carre Entrez un entier sur 1 caractere : 4 1 au carre = 01 2 au carre = 04 3 au carre = 09 4 au carre = 16 15/12/06 Programmes réponse Algorithme transformé en une itération tant que : lire chn et définir n carre = 0; k := 0 tque k < n faire carre := carre + 2*k + 1 k := k + 1 ecrire k au carre = carre fpour CARRE.ASM ideal model small stack 200h include "Nmacros.asm" dataseg k db ? ; variable d'itération, entier positif chk db ? ; chaîne de 1 car pour ecrire k n db ? ; entier positif entre 0 et 9 chn db 3 dup (?) ; chaîne de 3 car pour lire n carre db ? ; entier positif memorisant un carre chcarre db 4 dup (?) ; chaîne de 4 car pour ecrire carre mess db 'Entrez un entier sur 1 caractere : ' lmess dw $-mess mcarre db ' au carre = ' lmcarre dw $-mcarre fligne db 0Ah, 0Dh, ' ' lfligne equ 4 codeseg debut: mov ax, @data mov ds, ax ecrire [lmess], mess lirent1 chn, n ecrire lfligne, fligne mov [carre], 0 ; carre := 0 mov [k], 0 ; k := 0 tq: mov cl, [k] cmp cl, [n] jae ftq faire: ; si k < n ; calcul de carre = carre + 2*k + 1 mov al, [k] shl al, 1 add al, [carre] inc al mov [carre], al ; k := k + 1 inc [k] ; ecrire k au carre = carre ecrent1 chk, k Architecture des ordinateurs ecrire [lmcarre],mcarre ecrent2 chcarre, carre ecrire lfligne, fligne jmp tq ftq: ecrire lfligne, fligne exit end debut avec un loop : seul le codeseg change codeseg debut: mov ax, @data mov ds, ax ecrire [lmess], mess lirent1 chn, n ecrire lfligne, fligne mov [carre], 0 ; carre := 0 mov [k], 0 ; k := 0 mov cl, [n] mov ch, 0 mov dl, [k] cmp dl, [n] jae ftq tq: faire: ; si k < n ; calcul de carre = carre + 2*k + 1 mov al, [k] shl al, 1 add al, [carre] inc al mov [carre], al ; k := k + 1 inc [k] ; ecrire k au carre = carre push cx ecrent1 chk, k ecrire [lmcarre], mcarre ecrent2 chcarre, carre ecrire lfligne, fligne pop cx loop tq ftq: 15/12/06