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