                                                           
; -------------------------------------------------------------------                                                           
; A. Veneziani - Programma Assembly 8086 che converte un numero
;                letto da console nel corrispondente valore intero   
; -------------------------------------------------------------------

; Segmento dati con variabili assembly utilizzate nel programma
Dati	SEGMENT
N       DW ?    ; variabile che conterrà il valore del numero trasformato
Cont    DB ?    ; conta la cifra considerata (da destra)
Cc      DB ?    ; altro contatore per calcolo potenza di 10
Strng   DB 20d, 20 DUP(?)    ; stringa letta (numero sotto forma di stringa)
Base    DW 10d  ; costante 10 decimale
Dati	ENDS

Codice	SEGMENT
        ASSUME CS:Codice,DS:Dati
Inizio: MOV AX,Dati     ; setta effettivamente l'inizio del registro 
        MOV DS,AX       ; DS (segmento dati)
                                                                    
        ; porta in DX l'indirizzo di Strng                                                            
        ; indicando la zona di memoria dove depositare la stringa letta        
        LEA DX,Strng       
        ; chiama l'interrupt DOS per la lettura di una stringa...
        MOV AH,0Ah
        INT 21h 

        ;
        ; si appresta a convertire la stringa letta in numero intero...
        ;    
        MOV N,0000h	    ; azzera la cella di memoria N (16 bit)
        MOV Cont,01d    ; contatore che tiene conto della cifra considerata
        MOV BX,00d
        MOV CX,00d
        MOV BL,Byte Ptr[Strng + 1]      
Salta:  
        MOV CL,Byte Ptr[Strng + BX + 1]
	    SUB CL,48d
        
        ; sposta Cont in Cc tramite AL (operazione su 1 byte)
        MOV DL,Cont ; passa il contenuto di Cont a Cc
        MOV Cc,DL   ;   "        "          "                                        
        SUB Cc,01d  ; Cc ora contiene il valore di Cont - 1
                                            
        MOV AX,01h        
        ; se risulta elevato alla 0 (ossia cifra unità) salta alla
        ; moltiplicazione della cifra letta (CL) per 1        
        CMP Cc,00h
        JZ  Salta2                                                         

Calc10:   
        ; calcola la potenza di 10 opportuna per la cifra considerata    
        MUL Base 
        DEC Cc
        CMP Cc,0h
        JNE Calc10	        

Salta2:                 
        ; moltiplica la cifra per la pot. di 10 appena calcolata        
        MUL CX
        ; aggiunge il risultato al numero risultato N
        ADD N,AX	     

        DEC BX     
        INC Cont

        CMP BX,0d   ; ci sono altre cifre da leggere ?
        JNE Salta   ; allora salta alle operazioni di lettura sulla stringa
        
        ; ritorna al DOS
        MOV AH,4Ch
        INT 21h         
Codice	ENDS

END	Inizio