Vous êtes sur la page 1sur 6

Groupe 12

..
..
..

2015 2016

Algorithme : TRIE ;
Dclaration :
Constant : N = 20 ;
Type : table = tableau de N entier ;
Variable : i: entier ;

tab : table ;

Fonction : AFFICHE_DEC_ASCII(valDec : entier)


Variable :

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

Fonction : LIRE_ASCII_DEC() :dcimal

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

PARA STACK PILE


256 DUP ( 0 )
dw
dw
dw

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

;rcupration de la premire case

avant le traitement
mov nombre,4

;nbr est dclar au niveau P.P

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

mov bx, [bp+4]


mov cx, 10000
mov si, 0
valeur de la

;
;
;
;

bx : nombre
cx : diviseur
dx : reste
si : indicateur

; bx = nombre passe en paramtre


; initialise diviseur
; initialise indicateur : indique si le chiffre (cest--dire la
; variable quotient) doit tre afficher ou non

; si == 1: afficher i.e: si un chiffre a dja t affich


;
Ou si lon atteint le chiffre des units
; si == 0: 0 nombre !significatif==>non afficher

REPETER2:
mov dx, 0

; division nombre / diviseur

mov ax, bx

;diviser le contenue de (ax) sur celui de

(cx)
div cx

;quotient dans (ax)

, reste

cmp ax, 0
jne AFFICHE
cmp si, 1

; analyse du resultat de la division


; chiffre == 0??
; non ==> afficher
; chiffre == 0... doit-on

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

; rsultat de la division affect au registre cx


; SI diviseur(de l'itration suivante) != 1 ALORS on le

compare avc 0
jne SUITE
mov si, 1

; SINON
on atteint le chiffre des units
; i.e : indicteur = 1;

cmp cx, 0
jne REPETER2

; SI diviseur != 0 ALORS on itre

SUITE:

pop si
pop dx
pop cx
pop bx
pop ax
pop bp
ret
AFFICHE_DEC_ASCII
PHRASE
LPS

; rstauration des registres

ENDP
ENDP
ENDS
END

PHRASE

Vous aimerez peut-être aussi