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