; lettura_dos.asm

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 
 
 
; - asm2html -