Il numero 3576 in una ipotetica variabile
Per ora ho scritto questo programma ma c'è un problema:
- Se il numero è a una sola cifra tutto ok
- Se il numero è a più cifre allora non stampa nulla
Ecco il codice, non riesco a capire il perché nonostante il debug...
DATA SEGMENT PUBLIC
STRINGA DB "Numero: ",'$'
NUMERO DW 34 ;variabile che può contentere un numero qualsiasi
DIECI DW 10 ;divisore è 10 perchè cos' ottengo le singole cifre da stampare
CONTA DB 0 ;variabile contatore
NMAX DB ?
DATA ENDS ;fine del segmento dei dati
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
INIZIO: ;inizio del programma
MOV AX,DATA
MOV DS,AX ;carico i dati nel segmento dei dati
;AZZERO IL REGISTRO AX E BX poichè li uso per effettuare la serie di divisioni per ottenere così la stampa del numero finale.
XOR AX,AX ;azzero il registro AX
XOR BX,BX ;azzero il registro BX
MOV AX,NUMERO ;metto in AX il numero da dividere
MOV BX,DIECI ;metto in BX il numero che deve dividere cioè 10
CICLODIV: ;inizio del ciclo
CMP AX,9 ;confronto il registro AX con 9
JG DIVISIONE ;se il numero è maggiore di 9 significa che è almeno a due cifre quindi bisogna dividere per 10
JLE NODIVISIONE ;se il numero è minore o uguale a nove si rappresenta di sicuro in un byte e salto il ciclo
DIVISIONE:
;nel registro AX c'è il numero che devo dividere
DIV BX ;divido per 10 che è contenuto in BX --> AX QUOZIENTE E DX RESTO!!!
PUSH DX ;metto nello stack il resto della divisione che è contenuto in DX
;non tocco il registro ax in quanto contiene già il probabile successivo numero che deve dividere
ADD CONTA,1 ;incremento la variabile contatore
JMP CICLODIV ;salto incondizionato a "CICLODIV" così da ripetere il ciclo
NODIVISIONE:
MOV AH,09H ;richiesta per la stampa di una stringa
LEA DX,STRINGA ;carico la stringa in DX
INT 21H ;interrupt che permette la stampa della stringa
MOV NMAX,AL ;salvo il NMAX il contenuto di AL
CMP CONTA,0
JZ STAMPA1
JNZ STAMPA2
STAMPA1:
MOV AH,02H ;richiesta per la stampa di un singolo carattere
MOV DL,NMAX ;sposto in DL il carattere
ADD DL,30H ;conversione
INT 21H ;interrupt che permette di stampa il carattere
JMP EXIT ;salto incodizionato alla fine del programma
STAMPA2:
MOV AH,02H ;richiesta per la stampa di un singolo carattere
MOV DL,NMAX ;sposto in DL il carattere
ADD DL,30H ;conversione
INT 21H ;interrupt che permette di stampa il carattere
XOR AX,AX ;azzero il registro AX per sicurezza
xor bx,bx
CICLOSTAMPA: ;ciclo per la stampa di un numero a più cifre
POP BX ;tiro fuori il numero dallo stack in DX
MOV AH,02H ;richiesta per la stampa di un singolo carattere
MOV DL,BL
ADD DL,30H
INT 21H
SUB CONTA,1 ;decremento conta di 1
CMP CONTA,0
JZ EXIT ;se la variabile conta è uguale a zero allora ha finito i numeri e quindi esco dal ciclo
JNZ CICLOSTAMPA ;se la variabile non è zero allora ricomincio il ciclo per la stampa
EXIT:
MOV AH,4CH ;richiesta per restituire il controllo al DOS
INT 21H ;interrupt che permette di restituire il controllo al DOS
CODE ENDS ;fine del segmento del codice
END INIZIO ;chiusura etichetta che indica l'inizio del programma