Vi ringrazio!! Ormai ho concluso il mio programma. Vi allego la funzione che ho usato, magari può servire a qualcuno in futuro!!
Allora abbiamo la parte alta del numero da stampare in DX e quella bassa in AX
;-----------------------------------------------------------------------------------------------------;
; Procedura per stampare un numero in formato decimale ;
; ;
; REGISTRI UTILIZZATI: AX, BX, CX, DX ;
;-----------------------------------------------------------------------------------------------------;
STAMPA_32BIT PROC NEAR
XOR DI,DI ;Azzero DI
LOOP32BIT: CALL FDIV_BY_10 ;La funzione per dividere il numero per 10
PUSH BX ;Salvo BX
INC DI ;Incremento DI
CMP DX,0 ;Vedo se Dx e' uguale a 0
JNZ LOOP32BIT ;Se non e' zero Allora Ripete la funzione
CMP AX,10 ;Vede se in AX c'è 10
JAE LOOP32BIT ;se e' uguale o maggiore allora richiama funzione
CMP AX,0 ;se Ax e' a 0 (cioe' e' stato diviso per 10 )
JE LOOPPRNT32 ; allora richiama funzione per Stamparlo
PUSH AX ;Salvo AX
INC DI ;incremento DI
LOOPPRNT32: POP AX ;Ricupero AX
CALL STAMPA_NUMERO ;lo stampo
DEC DI ;decremento DI
JNZ LOOPPRNT32 ;se non e' DI Continuo con stampare
RET
STAMPA_32BIT ENDP
;-----------------------------------------------------------------------------------------------------;
; funzione che divide il numero (a 32 bit) per 10 ;
; ;
; REGISTRI UTILIZZATI: AX, BX, CX, DX ;
;-----------------------------------------------------------------------------------------------------;
FDIV_BY_10 PROC NEAR
; due passi, prima divido parte piu' significativa per 10 e poi resto di questa operazione
; e parte meno significativa per 10 nuovamente. Sono tutte operazioni in cui posso usare la DIV
MOV BX, 10 ; divisore
MOV CX,AX
MOV AX, DX ; metto in AX parte piu' significativa
XOR DX,DX ; azzero parte alta dividendo
DIV BX ; a questo punto mi trovo in AX il risultato e in DX il resto
XCHG CX,AX ; salvo risultato per dopo e recupero parte meno significativa
DIV BX ; divido anche questa (ma con resto in DX), in AX il risultato e in DX il resto
MOV BX, DX ; metto in BX il resto
MOV DX, CX ; metto in DX parte più significativa divisione
RET
FDIV_BY_10 ENDP
;-----------------------------------------------------------------------------------------------------;
; Procedura per stampare un numero ;
; ;
; REGISTRI UTILIZZATI: AX, BX, CX, DX ;
;-----------------------------------------------------------------------------------------------------;
STAMPA_NUMERO PROC NEAR
ADD AL,'0' ;La base da cui partire e' '0'
MOV AH,0Eh ;Servizio BIOS 'Write Char'
MOV BL,PAGINA ;Pagina attiva
MOV CX,0001h ;Stampa un solo carattere
INT 10h
RET ;Ritorno alla procedura chiamante
STAMPA_NUMERO ENDP