Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di rambco
    Registrato dal
    Aug 2001
    Messaggi
    582

    [Assembly] Divisioni successive

    Allora adesso vi spiego ! Io dovrei dividere un numero in esadecimale in modo da convertirlo in decimale per poi farlo stampare a video ! Ora il problema e' che non mi ricordo come si fa a passare da esadecimale a decimale !Io ricordo che si faceva con le divisioni successive ma non ricordo come! Qualcuno sa aiutarmi ?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    Qual'è il numero che devi convertire in esa?
    da come posti sembra che devi convertire un numero, ma numero in che formato è, decimale (non credo) perchè convertire un numero decimale in esa e poi di nuovo in decimale ( forse a scopo didattico se no che senso ha).
    il numero da convertire è in ottale o binario?

  3. #3
    Io ricordo che si faceva con le divisioni successive ma non ricordo come!
    Le "divisioni successive" si fanno nel procedimento inverso; da esadecimale a decimale basta moltiplicare le singole cifre per le corrispondenti potenze di 16:

    4AD3h = 4 * 16^3 + 10 * 16^2 + 13 * 16^1 + 3 * 16^0 = 19155

    P.S.: ma cosa c'entra l'assembly?

    Ciao.

  4. #4
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    il tuo numero decimale 19155 prova a portarlo in esa col procedimento inverso che hai fatto, ovvero con un solo passaggio.

    Se devi passare da decimale a esa, devi prima scomporlo in binario e poi in esa.

    I due passaggi da decimale a esadecimale:
    123 decimale
    1. passaggio 123 decimale a binario 111 1011
    2. passaggio 111 1011 binario a esadecimale 7B
    ---------------------------------------------------
    da binario a esadecimale un solo passaggio 111 = 7 1011 = B
    da esadecimale a binario un solo passaggio (7 = 111) (B = 1011)
    da binario a decimale un solo passaggio 111 1011 = 123
    da decimale a binario un solo passaggio 123 = 111 1011

    Ora il nostro amico a chiesto che deve dividere un numero in esadecimale.
    Il numero che deve dividere in che formato è?

    Da tabella sopra se il numero che deve dividere è in decimale deve fare due passaggi per ottenerlo in esadecimale.

    P.S. ma in questa discussione chi a parlato di assemby!


    link
    homepage http://%77%77%77%2e%74%77%6f%72%6b%2e%69%74/
    forum http://%77%77%77%2e%74%77%6f%72%6b%2...um/default.asp

  5. #5
    P.S. ma in questa discussione chi a parlato di assemby!
    Basterebbe leggere il titolo.

    Se devi passare da decimale a esa, devi prima scomporlo in binario e poi in esa.
    ...
    Da tabella sopra se il numero che deve dividere è in decimale deve fare due passaggi per ottenerlo in esadecimale.
    Non è assolutamente vero! Basta un passaggio solo, non serve portare prima a binario e poi a esadecimale. E' sufficiente dividere per 16, ed assegnare alle cifre esadecimali i valori dei resti successivi, che vanno da 0 a 15, posto che A=10, B=11, C=12, D=13, E=14, F=15.

    Ciao.

  6. #6
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    E' sufficiente dividere per 16, ed assegnare alle cifre esadecimali i valori dei resti successivi, che vanno da 0 a 15, posto che A=10, B=11, C=12, D=13, E=14, F=15.

    fammi un esempio concreto.......di un solo passaggio
    sono interessato

  7. #7
    19155

    19155 / 16 = 1197, 19155 % 16 = 3
    1197 / 16 = 74, 1197 % 16 = 13 = D
    74 / 16 = 4, 74 % 16 = 10 = A
    4 / 16 = 0, 4 % 16 = 4

    19155 = 4AD3h

  8. #8
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    io sono di tungsteno e non capisco...........

    19155 / 16 = 1197, 19155 % 16 = 3

    19155 / 16 = 1197, 1875 e questo è un passaggio poi che significa
    % 16 = 3

    sulla mia calcolatrive 19155 / 16 è = a 1197, 1875 sulla tua invece è = a 1197, 19155............ ma come mai!!!

    ha le pile scariche la tua calcolatrice?

  9. #9
    La conversione di un numero esadecimale è un classico problema che va affrontato, prima o poi, quando si programma in Assembly; tanto vale risolverlo, una volta per tutte, creandosi una o due procedure da richiamare all'occorrenza (o da inserire in una libreria LIB personale, da linkare ai nostri oggetti..)

    Naturalmente quando è necessario porre a video il risultato della conversione da esadecimale a decimale non è sufficiente conoscere il numero decimale corrispondente, ma bisogna interpretare la cifra decimale nei corrispondenti caratteri ASCII numerici, uno per le unità, uno per le decine, uno per le centinaia, e così via..

    Ecco perchè il numero esadecimale sorgente a 16 bit va diviso per 10000 ottenendo le decine di migliaia, ... e il suo resto per 1000 (per ottenere le miglaia) e così via, dividendo i rispettivi "resti" per 100 (centinaia) e per 10 (decine); l'ultimo resto sono le unità..

    Per farla corta eccoti due procedure belle e fatte, una per i numeri a 16 bit (Wor2Dec) e una per quelli a 8 bit (Byt2Dec); da notare che per la effettiva messa a video si utilizza la procedura BIOSchr1, che se vuoi posso inserirti con la prossima posta (per non rendere troppo grande il malloppo); si tratta di una semplice procedura che stampa a video un carattere, che certamente sei in grado di fare anche da solo...



    ; PROCEDURA : Wor2Dec.ASM
    ; DESCRIZIONE : Trasforma la Word esadecimale fornita in AX nei caratteri
    ; ASCII decimali corrispondenti, ponendoli a video nella
    ; posizione di stampa corrente
    ; Gli "0" non significativi non vengono stampati.

    EXTRN BIOchr1:NEAR
    Wor2Dec proc NEAR

    ;Salva i Registri usati dalla Procedura, compreso
    ;il valore da convertire, passato in ingresso in AX

    PUSH AX
    PUSH BX
    PUSH DX

    ;Se il numero esadecimale in ingresso è minore
    ;di 10000 la successiva divisione viene evitata

    CMP AX,10000
    JC Wor2_0

    MOV DX,0000H ;(DX,AX=0000XXXX) : (BX=10000)=AX, resto DX
    MOV BX,10000 ;Prepara il divisore a 10000
    DIV BX ;Esegue la divisione
    CALL STAasci ;Stampa il valore delle Decine di Migliaia

    ;Sposta in AX il Resto RRRR della divisione
    ;precedente da dividere nella fase successiva

    MOV AX,DX
    JMP SHORT Wor2_1

    ;Se il numero esadecimale in ingresso Š minore
    ;di 1000 la successiva divisione viene evitata

    Wor2_0: CMP AX,1000
    JC Byt2_0

    Wor2_1: MOV DX,0000H ;(DX,AX=0000XXXX) : (BX=1000)=AX, resto DX
    MOV BX,1000 ;Prepara il divisore a 1000
    DIV BX ;Esegue la divisione
    CALL STAasci ;Stampa il valore delle Migliaia

    ;Sposta in AX il Resto RRRR della divisione
    ;precedente da dividere nella fase successiva

    MOV AX,DX
    JMP SHORT Byt2_1


    ; PROCEDURA : Byt2Dec.ASM
    ; DESCRIZIONE : Trasforma il Byte esadecimale fornito in AL nei caratteri
    ; ASCII decimali corrispondenti, ponendoli a video nella
    ; posizione di stampa corrente
    ; Gli "0" non significativi non vengono stampati.

    Byt2Dec proc NEAR

    ;Salva i Registri usati dalla Procedura, compreso
    ;il valore da convertire, passato in ingresso in AL

    PUSH AX
    PUSH BX
    PUSH DX

    MOV AH,00H ;Formatta il dividendo al valore AX=00XX

    ;Se il numero esadecimale in ingresso è minore
    ;di 100 la successiva divisione viene evitata

    Byt2_0: CMP AX,100
    JC Byt2_2

    Byt2_1: MOV BL,100 ;Prepara il divisore a 100
    DIV BL ;Divide AX=00XX per BL=100 (AX:BL=AL, resto AH)
    CALL STAasci ;Stampa il valore delle Centinaia

    ;Sposta in AL il Resto RR della divisione pre-
    ;cedente da dividere nella fase successiva,
    ;formattando il dividendo al valore AX=00RR

    MOV AL,AH
    MOV AH,00H
    JMP SHORT Byt2_3

    ;Se il numero esadecimale in ingresso è minore
    ;di 10 la successiva divisione viene evitata

    Byt2_2: CMP AX,10
    JC Byt2_4

    Byt2_3: MOV BL,10 ;Prepara il divisore a 10
    DIV BL ;Divide AX=00XX per BL=10 (AX:BL=AL, resto AH)
    CALL STAasci ;Stampa il valore delle Decine
    MOV AL,AH ;Prepara in AL la cifra delle Unit…
    Byt2_4: CALL STAasci ;Stampa il valore delle Unità

    POP DX
    POP BX
    POP AX
    RET
    Byt2Dec ENDP
    Wor2Dec ENDP

    ;---------------------------------------------------------------------

    STAasci proc NEAR ;
    PUSH AX ; Accessorio delle procedure Precedenti
    ADD AL,30H ;
    CALL BIOchr1 ; Stampa il valore ASCII del numero in AL
    POP AX
    RET
    STAasci ENDP


    --------------------------------------------------------------------------------------------------------------------
    Giobe®2000 - Assembly & Turbo Pascal - Lezioni, programmi, segreti, trucchi ..
    --------------------------------------------[ I'm yours helper ]-------------------------------------------
    www.giobe2000.it - Conosci i meccanismi segreti che governano il tuo computer
    --------------------------------------------------------------------------------------------------------------------

  10. #10
    Per rambco: io ho ancora non ho capito una cosa. Il problema è la conversione in esadecimale e/o come stampare tale numero? E soprattutto, devi farlo in assembly o il linguaggio non ti interessa?

    Illuminaci!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.