Advertisement
Guest User

Untitled

a guest
Aug 18th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;*--------------------------------------------------------------------------------------------------------------
  2. ;*MODULE                      TP4 - Allocation memoire
  3. ;*--------------------------------------------------------------------------------------------------------------
  4. ;* Auteur(s) :   Bénédicte NOUYOU &   Vivien HUBERT
  5. ;*
  6. ;* Formation : ESIR              Groupe: 2A
  7. ;*--------------------------------------------------------------------------------------------------------------
  8.  
  9.         .model small
  10.         .stack
  11.         public ALLOUER, LIBERER, libre
  12.  
  13.  
  14.         .data
  15.    
  16. NBMAX           EQU 20                      ; nombre de blocs
  17. TBASE           EQU 16                      ; tailles des blocs
  18. bloc_t          EQU 0                       ; nombre de blocs libres consecutifs disponibles dans la zone
  19. bloc_suivant    EQU 2                       ; adresse du bloc libre suivant
  20.  
  21. zone            DW NBMAX                    ; nb de bloc de la zone
  22.                 DW 0FFFFh                   ; zone libre, donc comme c'est la seulle a l'état initiale, on met la marque de fin
  23.                 DW (NBMAX*TBASE)/2 - 2 DUP(?)   ; allocation de la zone
  24.      
  25. libre           DW Offset zone
  26.  
  27.     ; Params de ALLOUER
  28. allouer_t       EQU 4
  29. allouer_ptz     EQU 6
  30. allouer_fait    EQU 8
  31. allouer_tparam  EQU 8
  32.    
  33.         .code
  34.    
  35. ALLOUER:
  36.     ; sauvegarde du sommet de pile
  37.             PUSH BP
  38.             MOV BP, SP
  39.     ; sauvegarde des registres
  40.             PUSH AX BX CX DX SI
  41.            
  42.             MOV BX, libre                   ; on recupère l'endroit ou on va faire l'allocation
  43.  
  44.     ; on va chercher la première zone de taille suffisante
  45. allouer_tq_zone_trop_petite:
  46.     ; si on est rendu a la fin
  47.             CMP BX, 0FFFFh
  48.             JE allouer_plus_de_place
  49.  
  50.     ; on va comparer la taille nécessaire avec celle dispo dans la zone libre pointée par libre
  51.             MOV AX, [BP] + allouer_t   
  52.             CMP [BX] + bloc_t , AX
  53.             JGE allouer_zone_disponible     ; taille suffisante
  54.    
  55.     ; sinon on va regarder dans le bloc libre suivant ( adresse stockée dans libre )
  56.             MOV CX, BX                      ; On sauvegarde la zone précédent dans CX
  57.             MOV BX, [BX] + bloc_suivant
  58.             JMP allouer_tq_zone_trop_petite ; on reboucle
  59.                
  60. allouer_zone_disponible:
  61.     ; MAJ des params
  62.             MOV SI, [BP] + allouer_ptz
  63.             MOV [SI], BX                    ; on met a jour l'adresse de la zone
  64.             MOV SI, [BP] + allouer_fait
  65.             MOV byte ptr [SI], 1            ; on met a jour le booleen de retour de la fonction, NB a vrai ( i.e. 1 )
  66.    
  67.     ; On test si on utilise la totalité de la zone courante
  68.             MOV AX, [BP] + allouer_t        ; AX recupère le nombre de bloc que l'on veut
  69.             CMP [BX] + bloc_t, AX           ; on compare la taille dispo du bloc avec celle qu'on souhaite
  70.             JE allouer_zone_bloc_complete
  71.            
  72.             MOV AX, [BP] + allouer_t        ; AX recupère le nombre de bloc(s) que l'on veut
  73.             MOV DX,TBASE                    ; on affecte a dx la taille d'un bloc
  74.             MUL DX                          ; EQU   AX <= AX * DX
  75.                                             ;
  76.        
  77.             MOV SI, BX                      ; BX : Ancien pointeur de la zone courante
  78.             ADD SI, AX                      ; SI : Pointeur de la nouvelle zone libre
  79.            
  80.             MOV AX, [BX] + bloc_t           ; recupère le nombre de bloc de dispo dans la zone
  81.             SUB AX, [BP] + allouer_t        ; au quel au soustrait celui qu'on a réservé
  82.             MOV [SI] + bloc_t, AX           ; et on met le resultat dans le nombre de bloc de dispo dans lle bloc libre suivant
  83.            
  84.             MOV AX, [BX] + bloc_suivant     ; on récupère le bloc libre d'après
  85.             MOV [SI] + bloc_suivant, AX    
  86.    
  87.             CMP BX, libre
  88.             JNE allouer_maintenir_chainage
  89.            
  90.             MOV libre,SI
  91.             JMP allouer_fin
  92.    
  93. allouer_maintenir_chainage:
  94.             MOV BX,CX
  95.             MOV [BX + bloc_suivant], SI
  96.             JMP allouer_fin
  97.  
  98. allouer_zone_bloc_complete:
  99.             MOV SI, [BX] + bloc_suivant        
  100.    
  101. allouer_plus_de_place:
  102.     ; MAJ du booleen de retour a faux ( i.e. 0 )
  103.             MOV BX, [BP] + allouer_fait
  104.             MOV byte ptr[BX], 0
  105.    
  106. allouer_fin:
  107.            
  108.             POP SI DX CX BX AX
  109.             POP BP
  110.             RET allouer_tparam
  111.  
  112. ;----------------------------------------------------------------------------
  113. ; Procedure  LIBERER
  114. ;----------------------------------------------------------------------------
  115. ; liberer = fixe ( ent t , pointeur zone ptz )
  116. ;
  117. ;   Va liberer la zone de "t" blocs repréee par ptz
  118. ;----------------------------------------------------------------------------
  119.         .data
  120.     ; Params de LIBERER
  121. liberer_t       EQU 4
  122. liberer_ptz     EQU 6
  123. liberer_tparam  EQU 4
  124.        
  125.         .code
  126. LIBERER:
  127.             PUSH BP
  128.             MOV BP, SP
  129.             PUSH SI CX BX AX
  130.                                            
  131.             MOV SI, [BP] + liberer_ptz      ; On recupere l adresse du bloc a liberer
  132.             MOV CX, [libre]                 ; On récupère l'adresse contenu
  133.            
  134. l_cmp_bloc:
  135.             CMP SI, CX                      ; On compare les deux adresses
  136.             JL l_fin_recherche              ; On a trouve sa place
  137.            
  138.             MOV BX, CX                      ; Sauvegarde de cx
  139.             MOV CX, [BX] + bloc_suivant     ; On va cherche l'adresse de l element libre suivant
  140.             JMP l_cmp_bloc                  ; On reboucle
  141.  
  142. l_fin_recherche:           
  143.     ; On va modifier les blocs de la liste de libre
  144.             CMP CX, 0FFFFh                  ; On verifie qu'on est pas a la fin
  145.             JE l_fin_liste
  146.            
  147.             MOV [SI]+bloc_suivant, CX       ; On met a jour l'adress du bloc d'apres
  148. l_fin_liste:
  149.             MOV [BX] + bloc_suivant, SI     ; Mise a jour du pointeur sur le libre suivant
  150.             MOV AX, [BP] + liberer_t
  151.             MOV [SI] + bloc_suivant, AX     ; Mise de jour de la taille du nouveau bloc libre
  152.            
  153.             POP AX BX CX SI BP
  154.             RET liberer_tparam
  155.  
  156.  
  157.  
  158. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement