Recursivite en asm

Contenu du snippet

ce programme illustre la recursivite en assembleur
on utilise comme example la fonction de "FIBONACCI" et la "FACTORIEL"

Source / Exemple :


DONNE SEGMENT 

MESSAGE   DB 10,13,"*********CE PROGRAMME CALCULE LE SUIT DE FIBONACCI EN ASSEMBLEUR*******",10,13,'$'
UN_NUMERO DB 10,13,"	ENTRER LE RANG :  ",'$'
RESULTAT  DB 10,13,"			VIOCI LE RESULTAT ",'$'
MSGFACTO  DB 10,13,"      ET POUR LE FACTORIELLE LE RESULTATA EST : ",'$' 
MSGERREUR DB 10,13,"ENTRER UN NOMBRE SVP",'$'
DONNE ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DONNE
debut:
MOV AX,DONNE
MOV DS,AX

LEA DX,MESSAGE
MOV AH,09H
INT 21H
LEA DX,UN_NUMERO
INT 21H
MOV BX,0
MOV CX,10
 ;LECTURE ET CONVERTION DES DU NOMBRE LU DANS LE REGISTRE BX
LECT:
  MOV AH,01H ;on lit un caractaire
  INT 21H
  CBW
  CMP AL,13  ; si c'est ENTRER on va la suit du programme
  JE  SUIT    
  CMP AL,30H ;SINON ON VERIFIE SI C'EST UN CHIFFRE
  JL  ERREUR
  CMP AL,39H
  JA  ERREUR
  SUB AL,30H ;si oui on lui soustrait 30H
  XCHG AX,BX
  MUL  CX    ;on multiplie le resultat deja obtenu par 10
  JC   SUIT
  ADD  AX,BX ;ON L'ADDITIONNE AVEC LE NOMBRE LU
  XCHG AX,BX ; on met le resultat dans bx
  JMP  LECT
SUIT:
   MOV  CX,BX ;ON MET DANS CX LE RAG
   PUSH CX
   CALL FIBO
   MOV  DX,OFFSET RESULTAT
   MOV  AH,09H
   INT  21H
   CALL AFFICHE
   POP CX
   CALL FACTO
   MOV  BX,AX
   LEA  DX,MSGFACTO
   MOV  AH,09H
   INT  21H
   CALL AFFICHE
   JMP  FIN
ERREUR:
   LEA DX,MSGERREUR
   MOV AH,09H
   INT 21H
FIN:
  MOV AH,01H
  INT 21H
  MOV AH,4CH
  INT 21H
;*************************************************
;   LA PROCEDURE NON RECURSIVE DE FIBONACCI
;*************************************************
FIBO:
  XOR AX,AX
  JCXZ RETOURE
  MOV BX,AX
  INC AX
  CMP CX,1
  JBE RETOURE
TANQUE:
  PUSH AX
  ADD  AX,BX
  POP  BX
  LOOP TANQUE
RETOURE:
  RET
;***************************************************
;   LA PROCEDURE D'AFFICHAGE DU RESULTAT
;***************************************************
AFFICHE:
  mov cl,10
  MOV AX,BX
  MOV SI,0
  MOV DX,0
convert:
   INC SI
   div CX
   cmp AX,0
   je BOUCLE
   ADD DL,30H
   PUSH DX
   CWD
   JMP  CONVERT
BOUCLE:
   ADD  DX,30H
   PUSH DX
BCL:
   POP DX
   MOV AH,02H
   INT 21H
   DEC SI
   CMP SI,0
   JNE BCL
   ret
;*******************************************************************
;******************************************************************
;**** LA FONCTION FACTORIELLE RECURSIF                         ****
;******************************************************************
FACTO:
  XOR AX,AX
  INC AX
FACTORIELLE:
  JCXZ RET_PROG
  MUL  CX
  DEC  CX
  CALL FACTORIELLE   ;ICI LE CALL EST SEULLEMENT FAIR ILLUSION A LA RECURSIVITE
                     ; LE RESULTAT RESTERA LE MEME AVEC UN JMP MAIS TRES EFFICASSE
RET_PROG:
  ret

;****  FIN DE LA PROCEDURE    ******
CODE ENDS
END debut

A voir également