Académique Documents
Professionnel Documents
Culture Documents
..
..
..
2015 2016
Algorithme : TRIE ;
Dclaration :
Constant : N = 20 ;
Type : table = tableau de N entier ;
Variable : i: entier ;
tab : table ;
nbr,divs,quot,reste : entier ;
Dbut
nbr = valDec ;
divs = 100 ;
Rpter
quot = nbr div 2 ;
reste = nbr mod divs ;
si (quot != 0) alors
quot = quot + 48 ;
ecrire(quot) ;
fin si
nbr = reste ;
divs = divs div 10 ;
Jusqu (divs == 0)
Fin
tab : table ;
Variable :
nbr, c : entier ;
Dbut
Lire(c) ;
nbr = 0 ;
Tant que (nbr > 48 && nbr < 57) faire
nbr = nbr * 10 ;
nbr = nbr + (c 48)
Fin tant que
fin
Fonction : TRIE(T : table) :table
Variable :
j,x : entier ;
Dbut
Pour (i =1 N-1) faire
j = i+1 ;
Tant que (j <= N) faire
si (tab[i] > tab[j]) alors
x = tab[i] ;
tab[i] = tab[j] ;
tabji] = x ;
fin si
j=j +1;
Fin tant que
Fin Pour
Fin
Dbut :
Pour (i =1 N) faire
Tab[i] = LIRE_ASCII_DEC() ;
Fin Pour
Tab = TRIE(tab) ;
Pour (i =1 N) faire
Ecrire ( Tab[i] ) ;
Fin Pour
Fin
CDS
CDS
LDS
tab
nbr
N
LDS
LPS
PHRASE
SEGMENT
DB
ENDS
SEGMENT
ENDS
SEGMENT
PROC
ASSUME
ASSUME
ASSUME
MOV
MOV
5 dup(?)
?
?
FAR
CS : LPS
DS : LDS
SS : CDS
AX , LDS
DS , AX
mov si,tab
mov si,1
mov cx,5
LECTURE:
; Affectation des
; registres, obligatoires
; dans un programme
; on ne peut pas charger
; un registre segment qu partir dun autre
;prparation du tableau
call LIRE_ASCII_DEC
add sp,2
mov tab[si],bx
add si,2
LOOP LECTURE
call TRIE
mov si,tab
mov si,1
mov cx,5
AFFICHAGE:
push tab[si]
call AFFICHE_DEC_ASCII
;mov ah,09
;lea dx,vide
;int 21h
add si,2
LOOP AFFICHAGE
mov ah, 4ch
int 21h
;***************************************************************************************************
TRIE
PROC
push cx
mov si,1
mov cx,4
;tous les cases sauf la dernire
mov N,0
FOR:
add N,2
avant le traitement
mov nombre,4
TQ:
cmp nombre,10
jg FINTQ
mov si,nombre
mov ax,tab[si]
mov si,N
cmp ax,tab[si]
ja SUITE
push tab[si]
mov si,nombre
pop tab[si]
mov si,N
mov tab[si],ax
SUITE:
add nombre,2
jmp TQ
FINTQ:
add N,2
LOOP FOR
pop cx
ret
TRIE
ENDP
;*************************************************************************************
LIRE_ASCII_DEC
PROC
push ax
; sauvegarde des registres
utilises
push cx
mov bx,0
; nbr = 0
REPETER1:
mov ah,1
int 21h
mov cl,al
(code ASCII de
;lire(c)
; vider al pour pouvoire l'utiliser dans la soustraction
; caractre lu est maintenant dans le registre cl)
; assurer que la partie du bits poids fort soit null
; condition de la boucle
mov ch,0
cmp cl,48
jl FINREPETER1
cmp cl,57
jg FINRREPETER1
mov ax,10
mul bx
mov bx,ax
sub cx,48
add bx,cx
; nbr = nbr * 10
; valeur numrique(c)
; nbr = nbr + valeur
numrique(c)
jmp REPETER1
FINREPETER1:
pop cx
;rstauration des registres
pop ax
ret
LIRE_ASCII_DEC ENDP
;*********************************************************************************************************
AFFICHE_DEC_ASCII
PROC
push bp
; ce sous-programme prend un paramtre
: la valeur
mov bp, sp
; du nombre afficher
; sauvegarde des registres utilises:
push ax
; ax : quotient
push
push
push
push
bx
cx
dx
si
;
;
;
;
bx : nombre
cx : diviseur
dx : reste
si : indicateur
REPETER2:
mov dx, 0
mov ax, bx
(cx)
div cx
, reste
cmp ax, 0
jne AFFICHE
cmp si, 1
dans (dx)
lafficher ?
jne FINSI
AFFICHE:
add ax,48
mov ah,2
int 21h
mov si, 1
FINSI:
itration(si exite
mov bx, dx
mov dx, 0
mov ax, cx
mov cx, 10
div cx
mov cx, a
cmp cx, 1
; affichage du chiffre
; indicateur positionn(un chiffre est dja affich)
;Prparation du nombre et diviseur de la prochaine
; nombre = reste
; diviseur = diviseur / 10
compare avc 0
jne SUITE
mov si, 1
; SINON
on atteint le chiffre des units
; i.e : indicteur = 1;
cmp cx, 0
jne REPETER2
SUITE:
pop si
pop dx
pop cx
pop bx
pop ax
pop bp
ret
AFFICHE_DEC_ASCII
PHRASE
LPS
ENDP
ENDP
ENDS
END
PHRASE