Dati SEGMENT
  Numero_in DB 6 DUP(?)      ; numeri alfanumerici in ingresso e uscita
  Numero_out DB 6 DUP(?)
  Cifra      DB ?            ; singola cifra (numerica o alfanumerica)
  Molti      DW ?            ; valore moltiplicatore (potenza di 10  - 10^x)
  N          DW ?            ; rappresentazione numerica del valore
  Potenza    DB 10d        ; valore costante 10 decimale
Dati ENDS
  
Codice SEGMENT  
    Inizio:   
    
    MOV AX,Dati
    MOV DS,AX
     
    ;-------------------------------------------------------------------
    ; Blocco delle istruzioni di lettura del numero intero (senza segno)
    ;------------------------------------------------------------------- 
    MOV CX,0d
    MOV BX,Offset Numero_in
Ciclo:
    MOV AH,1d     ; invoca il servizio DOS di lettura di un solo carattere
    INT 21h  
    CMP AL,13d    ; e' stato premuto Invio - termine lettura
    JE Fine_Lettura
    MOV Byte Ptr[BX],AL
    INC BX   
    INC CX
    JMP Ciclo                                                           
    ;-------------------------------------------------------------------     
             
    ;-----------------------------------------------------------------------
    ; Blocco delle istruzioni di conversione da alfanumerico a valore intero
    ;-----------------------------------------------------------------------              
Fine_Lettura:
    DEC BX             
    MOV N,0d         
    MOV Molti,1d
Conversione:
    MOV AL,Byte Ptr[BX]  ; prende una delle cifre lette  
    MOV Cifra,AL
    SUB Cifra,48d           ; individua il valore numerico da quello ASCII
          
    MOV AH,0d      
    MOV AL, Cifra   ;  calcola il "peso" della cifra, ossia il suo valore effettivo
    MUL Molti        
    ADD N,AX        ; somma il valore della cifra al numero totale
    
    MOV AX,Molti   ; calcola la nuova potenza di 10 per la prossima cifra
    MUL Potenza            
    MOV Molti,AX
    
    DEC BX
    LOOP Conversione                                                     
    ;-----------------------------------------------------------------------  
        
                        
    ROL N,1    ; <-- effettua una semplice operazione su N ( moltiplicazione per 2)                    
        
                        
    ;-----------------------------------------------------------------------
    ; Blocco delle istruzioni di stampa del risultato posto in N
    ; (conversione da N in alfanumerico e stampa di ogni singolo carattere)
    ;-----------------------------------------------------------------------    
         
    MOV DL,10d       
    MOV AH,2d
    INT 21h
    
    MOV BX, Offset Numero_out             
             
Ripeti:
    MOV DX,0d         ; carica il dividendo    
    MOV AX,N
    DIV Word Ptr [Potenza]   ; divisione per 10 (vista come divisione 32 bit / 16 bit
    MOV Cifra,DL         ; recupera il resto (in DX )
    MOV N,AX  
    
    ADD Cifra,48d        ; data la cifra numerica individua il corrispondente ASCII
    MOV AL,Cifra         ; e lo immagazzina in Numero_out
    MOV Byte Ptr[BX],AL
    INC BX
        
    CMP N,10d     ; se il quoziente è superiore a 10 non ha terminato il procedimento
    JA Ripeti    
                 
    ADD N,48d     ; converte N in ASCII e lo inserisce nell'ultima cifra di Numero_out 
    MOV AX,N                     
    MOV [BX],AL
                                                                            
    ;                                                                        
    ; ciclo (contatore BX) che stampa tutto il vettore di ASCII Numero_out        
    ;
Stampa:             
    MOV DL,Byte Ptr[BX]         
    MOV AH,2d             ; richiama l'apposito servizio DOS di stampa...
    INT 21h        
    DEC BX                ;   sposta all'indietro l'indice BX
    CMP BX, Offset Numero_out   ; se BX è arrivato all'inizio del vettore
    JAE Stampa                                                              
    
    ;-----------------------------------------------------------------------    
    
    MOV AH,4Ch     ; ritorno al DOS...
    INT 21h
    
Codice ENDS

END Inizio

