STAMPARE A 32 BIT

di il
2 risposte

STAMPARE A 32 BIT

Ciao a tutti.
Devo svolgere questo esercizio in assembly:
Scrivere un programma che accetti in ingresso un numero X compreso fra 0 e 1.000.000.
Il programma acquisisca un numero k compreso fra 0 e 250
e stampi tutti i numeri tutti i numeri compresi nell’intervallo X e X+100 che siano multipli di k.
Devo utilizzare i registri a 16bit (non so che assembly è, ma non riconosce registri come EAX).
Il mio problema è stampare i numeri. I numeri da stampare sono divisi (PARTE ALTA e PARTE BASSA) in 2 registri a 16 bit. Ad esempio:
se devo stampare 1.000.000 avrò "F" in DX e "4240" in AX, quindi se stampo in decimale ottengo "1516960" e non 1.000.000.
HELP ME!!!!!

2 Risposte

  • Re: STAMPARE A 32 BIT

    Ciao
    devi usare delle stringhe.
    quando converti in decimale metti il risultato all'interno di una stringa e poi ti stampi la stringa.
    comunque se ti serve maggiore aiuto posta il codice che hai fatto.
    spero di esserti stato di aiuto
  • Re: STAMPARE A 32 BIT

    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
Devi accedere o registrarti per scrivere nel forum
2 risposte