riccardinofuffolo

Calcolatori elettronici - #503

Jun 20th, 2011
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DIM EQU 11
  2.  
  3. .MODEL SMALL
  4. .STACK
  5. .DATA
  6.  
  7. STRINGA DB "notte rossa"
  8. DIM_AGG DB ?
  9.  
  10. .CODE
  11. .STARTUP
  12.  
  13. LEA AX, STRINGA
  14. PUSH AX                         ; Metto nello stack il primo parametro (indirizzo)
  15. MOV AX, DIM
  16. PUSH AX                         ; Metto nello stack il secondo parametro (dimensione)
  17. SUB SP, 2                       ; Faccio spazio per il parametro di ritorno
  18. CALL CONVERTI
  19. POP AX
  20. MOV DIM_AGG, AL  
  21. ADD SP, 4                       ; "Riavvolgo" lo stack (4 = 2*n)
  22.                                 ; con n = # parametri passati (non di ritorno!)
  23.  
  24. .EXIT
  25.  
  26. CONVERTI PROC
  27.     MOV BP, SP                  ; PRIMA istruzione di qualunque procedura che usa lo stack!
  28.  
  29.     PUSH SI                     ; Prima anche delle PUSH :)
  30.     PUSH CX
  31.     PUSH AX
  32.     PUSH DX
  33.  
  34.  
  35.     MOV SI, [BP+6]              ; In SI ho l'indirizzo di partenza della stringa
  36.     MOV CX, [BP+4]              ; In CX ho la lunghezza originale della stringa
  37.     DEC CX                      ; ... l'ultimo carattere però non lo devo confrontare con il successivo :)
  38.     MOV AX, 0                   ; Tengo un registro per contare quante cancellazioni ho fatto
  39.  
  40.     CICLO: MOV DL, [SI]         ; Prendo il carattere in posizione i
  41.            CMP DL, [SI+1]       ; Confronto con quello in posizione i+1
  42.            JNE NEXT             ; Sono uguali?
  43.  
  44.     INC AX                      ; Sono uguali. Devo effettuare uno shift: incremento il contatore
  45.  
  46.     MOV [BP-2], SI              ; Salvo i registri SI/CX (potevo farlo con la POP, è giusto per esercizio)
  47.     MOV [BP-4], CX
  48.     SHF: MOV DL, [SI+1]         ; Shifto tutti i caratteri da quello di partenza al finale
  49.          MOV [SI], DL           ; (faccio CX passi!)
  50.          INC SI
  51.          LOOP SHF
  52.     MOV CX, [BP-4]              ; Ripristino il corretto valore dei registri
  53.     MOV SI, [BP-2]
  54.     LOOP CICLO                  ; Nascosto in questa istruzione c'è il fatto che ho decrementato
  55.                                 ; la stringa di 1 carattere (il puntatore SI NON si sposta!)
  56.  
  57. NEXT: INC SI                    ; Non sono uguali: passo al successivo carattere
  58.       LOOP CICLO                ; e diminuisco il numero di passi (ma non la lunghezza!)
  59.  
  60.       MOV CX, [BP+4]            ; Riprendo la lunghezza originale della stringa
  61.       SUB CX, AX                ; Sottraggo il numero di shift che ho fatto = nuova lunghezza
  62.       MOV [BP+2], CX            ; Salvo il ritorno nello stack
  63.  
  64.     POP DX                      ; Ripristino tutti i registri coinvolti
  65.     POP AX
  66.     POP CX
  67.     POP SI
  68.  
  69.     RET
  70. CONVERTI ENDP
  71.  
  72. END
Advertisement
Add Comment
Please, Sign In to add comment