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