riccardinofuffolo

Calcolatori elettronici - #307

Jun 7th, 2011
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DIM EQU 11
  2. LETTERE EQU 26
  3. .MODEL SMALL
  4. .STACK
  5. .DATA
  6.  
  7. STRINGA DB "SaSsO RoSsO"
  8. STATISTICA DB LETTERE DUP(0)
  9.  
  10. .CODE
  11. .STARTUP
  12.  
  13. MOV CX, DIM                     ; NON posso fare MOV CX, LENGTH STRINGA perchè STRINGA non è allocata con una DUP
  14. MOV SI, 0                       ; Indice di scansione del vettore
  15. MOV BH, 0                       ; Azzero la parte alta di BX
  16.  
  17. SCAN:     MOV BL, STRINGA[SI]   ; Uso BL perchè BX ha la doppia funzione dato/indirizzamento
  18.      
  19.           CMP BL, 65D           ; Minore di A?          
  20.           JB NEXT               ; Non è una lettera
  21.           CMP BL, 90D           ; Maggiore di A e maggiore di Z?
  22.           JA FORSEMIN           ; Allora, forse, è una minuscola
  23.           JMP STORE             ; Altrimenti è una maiuscola, e passo direttamente a salvarla
  24.          
  25. FORSEMIN: CMP BL, 97D           ; Minore di a?          
  26.           JB NEXT               ; Non è una lettera
  27.           CMP BL, 122D          ; Maggiore di z?
  28.           JA NEXT               ; Non è una lettera
  29.           SUB BL, 32D           ; Altrimenti è una minuscola. La converto in maiuscola.
  30.      
  31. STORE:    ADD STATISTICA[BX-65], 1  ; Incrementa le relative occorrenze
  32. NEXT:     INC SI                ; Passa alla prossima lettera
  33.           LOOP SCAN  
  34.  
  35. MOV CX, LETTERE    
  36. MOV SI, 0
  37. PRINTR:   CMP STATISTICA[SI], 0 ; Ho letto almeno una lettera *?
  38.           JE NEXTS              ; Se no, salto alla prossima
  39.          
  40.           MOV DX, SI            ; Memorizzo la corrispondente lettera minuscola in DX (anzi, DL)  
  41.           ADD DX, 97            ; MOV DX, SI+97... non sei in C =D
  42.           MOV AH, 02            ; Predispongo per la stampa
  43.           INT 21H               ; Interruzione per la stampa
  44.          
  45.           MOV DL, 32D           ; Spazio fra lettera e asterischi
  46.           INT 21H               ; Interruzione per la stampa
  47.          
  48.           PUSH CX               ; Salvo un attimo CX  
  49.           MOV CX, 0
  50.           MOV CL, STATISTICA[SI]   ; Uso temporaneamente un nuovo contatore
  51.          
  52.           STARS: MOV DL, 42D    ; Codice ASCII "*"
  53.                  INT 21H        ; Interruzione per la stampa
  54.                  LOOP STARS
  55.          
  56.           POP CX                ; Ripristino il CX delle lettere
  57.            
  58.           MOV DL, 10D           ; CR + LF
  59.           INT 21H
  60.           MOV DL, 13D
  61.           INT 21H      
  62.          
  63. NEXTS:    INC SI      
  64.           LOOP PRINTR  
  65. .EXIT
  66. END
Advertisement
Add Comment
Please, Sign In to add comment