Trasfornazione numero

di il
33 risposte

Trasfornazione numero

dati segment
    cifra db 0h
    numero db 0h

    dsg db "Il risulato è: $"
dati  ends
codice segment
    assume cs: codice, ds: datinumero, al
      ret
   
      endp
codice ends
end inizio

33 Risposte

  • Re: Trasfornazione numero

    Un carattere ASCII che rappresenta una cifra ha valore esadecimale compreso tra

    0x30 e 0x39

    mentre il valore numerico corrispondente è tra

    0x00 e 0x09

    Non riesci a risolvere?
  • Re: Trasfornazione numero

    No, sono alle prime armi con assembly, mi potresti dire come fare più precisamente? Ti ringrazio.
  • Re: Trasfornazione numero

    Devi prendere solo la parte bassa del valore e quindi devi fare una AND tra il valore e 0x0F
  • Re: Trasfornazione numero

    Il valore della variabile numero?
    Scusami ma sono davvero inesperto, è il terzo programma che faccio in assembly
  • Re: Trasfornazione numero

    Certo, ovvio.
  • Re: Trasfornazione numero

    E come scrivo la sintassi?
  • Re: Trasfornazione numero

    Andiamo ... prova tu!
  • Re: Trasfornazione numero

    Il risultato lo metto in una variabile e poi chiamo ah, 02h
    Int 21h per mandarlo in output che dici?
  • Re: Trasfornazione numero

    Ma per fare cosa? Stai facendo confusione.
  • Re: Trasfornazione numero

    Io dò un numero ad esempio 45 che corrisponde ad un carattere ASCII, dopodichè devo mandare in output il carattere, e fin qui ok, la parte che non riesco a fare è mandare in output il valore 45 in Numero, anziche in carattere ASCII corrispondente . Mi sono spiegato?
  • Re: Trasfornazione numero

    Allora .. ricominciamo ...

    Vedo dal codice (che non hai scritto tu) che esegui una

    sub al, 30h

    che equivale alla AND di cui ti parlavo. Quindi GIA' FAI quello che ti avevo suggerito.
    Inoltre hai nella variabile numero il TOTALE della somma dei valori inseriti e non una sola cifra.

    A questo punto il valore di numero (che sarà minore di 256) sarà in binario e per visualizzarlo, dovrai

    1) dividerlo per 10, ottenendo un risultato e un resto
    2) se il risultato è zero, fermi il programma
    3) altrimenti trasformi in ASCII il risultato aggiungendo 0x30 e lo mandi in output
    4) prendi il resto e lo metti in numero
    5) passi al primo punto
  • Re: Trasfornazione numero

    Ho fatto in questo modo, compila, ma mi dà 0 come output. :\




    dati segment
        resto1 db 0h
        cifra1 db 0h
        cifra2 db 0h
        numero db 0h
        
        msg1 db "Inserisci delle cifre (0 per terminare): $"
        msg66 db "La somma corrisponde a: $"
        msg3 db "Il risulato corrisponde a: $"
    dati  ends
    codice segment
        assume cs: codice, ds: dati
    inizio:
        mov ax, dati
        mov ds, ax
        mov ax, 0000h
        mov bx, 0000h
        mov numero, 0h
        lea dx, msg1
        mov ah, 09h
        int 21h
    
    comincia:
        call inse
        cmp al, 0h
        jne comincia
     
    
      
            mov bl,dl
             mov AH,02h
             mov DL,13
             int 21h
             mov AH,02h
             mov DL,10
             int 21h
    
      
        lea dx, msg3
        mov ah, 09h
        int 21h
           
             
             
        mov dl,numero
        mov ah, 02h
        int 21h                           ;output ascii
        mov ah, 4ch
        
        
      
        mov bl,dl
            mov AH,02h
            mov DL,13
             int 21h
             mov AH,02h
             mov DL,10
             int 21h
          
        lea dx, msg66
        mov ah, 09h
        int 21h
     
     
        ciao:                                    ;parte modificata
             mov al, numero
             mov bl,10h
             div bl
             cmp al,0h
             je fineprog
             mov al, 30h        
             mov dl, al
             mov ah,02h
             int 21h
             mov ah, 4ch
             mov numero, ah
             call ciao
             
    fineprog:
               int 21h         
      
     
    
      
    inse proc near
          mov ah, 01h
          int 21h
          sub al, 30h
          add numero, al
          ret
       
          endp
    codice ends
    end inizio
  • Re: Trasfornazione numero

    Intanto la divisione è per 10 ma in esadecimale 10h vale 16 ... devi usare 0ah in esadecimale

    Poi non si usa la call per tornare ad un punto del codice per il ciclo ma la jmp

    E infine, devi rivedere l'uso dei registri dl a al nel ciclo perché non va bene.
  • Re: Trasfornazione numero

    Credo di esserci quasi... Però come output mi dà sempre 0. Dovè che sbaglio?

    
    ciao:
             mov al, numero
             mov bl, 10d             ;divido per 10 decimale
             div bl
             cmp al,0h
             je fineprog
             mov al, 30h
             mov dl, al        ;mando in output il contenuto di al, 
                                       spostandolo in dl
             mov ah,02h
             int 21h
             mov ah, 4ch
             mov numero, ah
             jmp ciao
             
    fineprog:
               int 21h
Devi accedere o registrarti per scrivere nel forum
33 risposte