Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DIM EQU 11
- LETTERE EQU 26
- .MODEL SMALL
- .STACK
- .DATA
- STRINGA DB "SaSsO RoSsO"
- STATISTICA DB LETTERE DUP(0)
- .CODE
- .STARTUP
- MOV CX, DIM ; NON posso fare MOV CX, LENGTH STRINGA perchè STRINGA non è allocata con una DUP
- MOV SI, 0 ; Indice di scansione del vettore
- MOV BH, 0 ; Azzero la parte alta di BX
- SCAN: MOV BL, STRINGA[SI] ; Uso BL perchè BX ha la doppia funzione dato/indirizzamento
- CMP BL, 65D ; Minore di A?
- JB NEXT ; Non è una lettera
- CMP BL, 90D ; Maggiore di A e maggiore di Z?
- JA FORSEMIN ; Allora, forse, è una minuscola
- JMP STORE ; Altrimenti è una maiuscola, e passo direttamente a salvarla
- FORSEMIN: CMP BL, 97D ; Minore di a?
- JB NEXT ; Non è una lettera
- CMP BL, 122D ; Maggiore di z?
- JA NEXT ; Non è una lettera
- SUB BL, 32D ; Altrimenti è una minuscola. La converto in maiuscola.
- STORE: ADD STATISTICA[BX-65], 1 ; Incrementa le relative occorrenze
- NEXT: INC SI ; Passa alla prossima lettera
- LOOP SCAN
- MOV CX, LETTERE
- MOV SI, 0
- PRINTR: CMP STATISTICA[SI], 0 ; Ho letto almeno una lettera *?
- JE NEXTS ; Se no, salto alla prossima
- MOV DX, SI ; Memorizzo la corrispondente lettera minuscola in DX (anzi, DL)
- ADD DX, 97 ; MOV DX, SI+97... non sei in C =D
- MOV AH, 02 ; Predispongo per la stampa
- INT 21H ; Interruzione per la stampa
- MOV DL, 32D ; Spazio fra lettera e asterischi
- INT 21H ; Interruzione per la stampa
- PUSH CX ; Salvo un attimo CX
- MOV CX, 0
- MOV CL, STATISTICA[SI] ; Uso temporaneamente un nuovo contatore
- STARS: MOV DL, 42D ; Codice ASCII "*"
- INT 21H ; Interruzione per la stampa
- LOOP STARS
- POP CX ; Ripristino il CX delle lettere
- MOV DL, 10D ; CR + LF
- INT 21H
- MOV DL, 13D
- INT 21H
- NEXTS: INC SI
- LOOP PRINTR
- .EXIT
- END
Advertisement
Add Comment
Please, Sign In to add comment