riccardinofuffolo

Calcolatori elettronici - Esame 11/11/2008

Jun 27th, 2011
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DIM EQU 6
  2. .MODEL SMALL
  3. .STACK
  4. .DATA
  5.        
  6. VETT DB "ABACO3TE2ETE1RCOLAIO1BBUONO2ILE"                        
  7. MAX DB 0
  8. PAROLAMAX DB 20 DUP(?)                         ; Sovradimensionato.
  9.  
  10.        
  11. .CODE
  12. .STARTUP
  13.  
  14. CALL PAROLE
  15.        
  16. ; Stampa
  17. LEA DX, PAROLAMAX
  18. MOV AH, 09H
  19. INT 21H
  20.  
  21. .EXIT      
  22.  
  23. PROC PAROLE    
  24.    
  25.     MOV SI, 0                          ; Indice di scorrimento del vettore
  26.     MOV CX, 0                          ; CH = Dimensione della parola più lunga  
  27.     MOV DX, 0                          ; DL = Lettere da considerare nel primo blocco  
  28.     MOV AL, DIM-1                      ; AL = Contatore parole da analizzare
  29.    
  30.     ; La prima parola la tratto a parte  
  31.     PRIMA: MOV AH, VETT[SI]  
  32.            CMP AH, "9"
  33.            JBE FINITA
  34.            
  35.            MOV PAROLAMAX[SI], AH
  36.            INC CH
  37.            INC SI
  38.            JMP PRIMA  
  39.    
  40.     ; Quando trovo il primo numero lo memorizzo (sarà il numero di lettere da prendere
  41.     ; e concatenare con quelle del blocco successivo) e metto un fine stringa          
  42.     FINITA: SUB AH, "0"
  43.             MOV DL, AH
  44.             MOV PAROLAMAX[SI], "$"  
  45.    
  46.     INC SI                             ; Partenza della successiva
  47.     MOV BX, SI                         ; Arrivo della successiva (arrivo = partenza)
  48.    
  49.     ; Le successive le tratto a parte (primo pezzo uguale a sopra)
  50.     SUCCESSIVA: MOV AH, VETT[BX]
  51.                 CMP AH, "9"
  52.                 JBE FINEBLOCCO
  53.                
  54.                 INC BX                 ; Passa alla successiva lettera del blocco
  55.                 INC CL                 ; Conta una lettera in più
  56.                 JMP SUCCESSIVA        
  57.    
  58.                
  59.     FINEBLOCCO: ADD CL, DL             ; CL = caratteri contati nel nuovo blocco, DL = caratteri del primo blocco
  60.                 CMP CL, CH             ; La nuova parola è più lunga?
  61.                 JBE CORTA
  62.                
  63.      
  64.                 MOV DI, DX             ; Sì, è più lunga, devo partire a modificare dopo DL posizioni    
  65.     SPOSTA:     MOV AH, VETT[SI]      
  66.                 MOV PAROLAMAX[DI], AH  ; Modifico la parola più lunga in memoria
  67.                 INC DI
  68.                 INC SI
  69.                 CMP SI, BX             ; Partenza = arrivo?
  70.                 JNE SPOSTA  
  71.                 MOV PAROLAMAX[DI], "$" ; Termino col fine stringa
  72.                 MOV AH, VETT[SI]       ; Ripristino il contatore caratteri per il primo blocco
  73.                 XCHG CL, CH            ; Aggiorno la lunghezza della parola più lunga
  74.                
  75.     CORTA:      MOV SI, BX             ; No, non è più lunga            
  76.                 INC SI                 ; Nuovo indice di partenza
  77.                 MOV BX, SI             ; ... e arrivo
  78.                
  79.                 MOV DL, AH             ; Salvo il nuovo numero di caratteri da considerare nel primo blocco
  80.                 SUB DL, "0"            ; Correzione ASCII                      
  81.                 MOV CL, 0              ; Azzero il contatore per i caratteri del nuovo blocco
  82.  
  83.                 DEC AL                 ; Passo al successivo blocco
  84.                 CMP AL, 0              ; Ho finito i blocchi?
  85.                 JNE SUCCESSIVA
  86.                                        
  87.     MOV MAX, CH                        ; Ritorna il massimo
  88.                        
  89.     RET
  90. ENDP PAROLE
  91. END
Advertisement
Add Comment
Please, Sign In to add comment