; str2num.asm

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