Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [ASM] Conversione di una word 32 bit in codice ascii

    Salve a tutti! stò cercando di convertire una word di 32 bit in codice ascii o meglio in un numero che possa essere stampato a video. Per fare ciò avevo trovato questa procedura...

    PrintDecimal32:
    mov ebp,10 ; Destination base is decimal
    xor cx,cx ; CX = 0, it will be our digit counter

    .DivideAgain:
    xor edx,edx ; Clear high portion of dividend to prevent divide errors
    div ebp ; EDX:EAX/EBP -> EAX r EDX

    push dx ; Push the remainder (always 0-9) onto the stack
    inc cx ; Increment the number of digits we know we have on the stack

    test eax,eax ; Is the quotient from DIV zero?
    jnz .DivideAgain ; If not, then there are more digits to be extracted from the number, so loop

    .PrintMore:
    pop ax ; Pop the next digit to be printed (0-9)
    add al,"0" ; Convert it to an ASCII character ("0"-"9")
    int 29h ; Print it
    dec cx ; Decrement our counter of the number of digits we know are remaining on the stack
    jnz .PrintMore ; Zero? If not then we have more digits to print.

    ret ; Return to the caller

    ma nn so per quale motivo sembra che nn vada e qualunque nuemro io inserisca mi stampa sempre a video il numero 2340 che nn è assolutamente il numero che deve stampare...prima di chiamare questa procedura il mio numero è contenuto in DX:AX...qualcuno sa dirmi cosa sbaglio?!

  2. #2
    mi kiedo se il problema sia dovuto allo xor edx,edx che và a cancellarmi parte dei dati da dividere...ne sono quasi convinto...per questo ho provato a mettere dx:ax in eax in questo modo:
    shl eax,16
    xor ax,ax
    mov ax,dx

    ma nn và uguale anzi questa volta si blocca...

  3. #3
    Non so se ho capito bene quello che chiedi cmq se potrebbe esserti utile ti allego un programma che ho fatto tempo fa x scuola:
    ;Aquisice un carattere e ne stampa il suo codice ascii


    .MODEL SMALL
    .STACK 100d
    .DATA
    w DW ?
    .CODE
    .STARTUP

    ;Aquisisco carattere
    MOV AH,01H
    INT 21H

    ;lo salvo in 'w'
    MOV BH,0d
    MOV BL,AL
    MOV w,BX

    ;A capo
    MOV DL,0AH
    MOV AH,02H
    INT 21H
    MOV DL,0DH
    MOV AH,02H
    INT 21H
    ;Fine a capo

    ;Chiamo la proceduro per stampare un numero fino 255 passandogli quello che deve stampare in BX
    MOV BX,w
    CALL STAMPAN

    .EXIT
    STAMPAN PROC

    PUSH BX

    ;Stampa numeri a 2 cifre

    MOV SI,0
    CICLO:

    POP AX
    PUSH AX
    MOV AH,0d
    MOV BL,10
    DIV BL

    PUSH AX



    INC SI

    CMP AL,0
    JE PROSEGUI

    JMP CICLO



    PROSEGUI:


    MOV CX,SI
    STAMPA:

    DEC SI
    POP AX
    MOV DL,AH
    ADD DL,30H
    MOV AH,02H
    INT 21H



    LOOP STAMPA

    POP CX
    RET
    STAMPAN ENDP

    END

  4. #4
    Ti ringrazio per l'attenzione ma mi sà tanto che questo programma non vada bene...io ho bisogno di convertire un numero a 32 bit situato in DX:AX in codice ascii....qualcuno a qualche altra idea?!

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [ASM] Conversione di una word 32 bit in codice ascii

    Il codice che hai mostrato divide un valore a 64 bit per uno a 32. Infatti hai scritto

    EDX:EAX/EBP -> EAX r EDX

    Ma tu devi dividere un valore a 32 bit per uno a 16, quindi

    DX:AX/BX -> AX r DX

    Ovviamente, se il risultato della divisione non puo' essere contenuto in un valore a 16 bit, avrai un overflow di divisione.

    Ti avevo mostrato un esempio di codice in C per la divisione per 10 che ti serviva ... non lo hai voluto usare ...

  6. #6
    Ho cercato di usarlo ma nn ci sono saltato fuori...ho provato anke ad utlizzare solo registri a 16 bit come mi avevi suggerito tu ma è stato inutile poichè quando andavo a dividere numeri molto grandi aveno appunto overflow di divisione...nn sò ke dire riproverò a rivedere qual codice in c ke mi avevi postato...

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Comunque, questo codice non ti funziona solamente perche' il valore che devi visualizzare deve essere contenuto tutto nel registro EAX. Se hai il valore a 32 bit in DX:AX, prova ad inserirlo tutto in EAX.

  8. #8
    ...un altra cosa...io nn posso utlizzare solo i registri DX e AX per poter fare la divisione poiche il mio massino numero da dividere è 998001 che è nettamente più grande di 65536 con 16 bit. Questo è il motivo per cui ho pensato che quell'algoritmo andasse bene e che il mio errore fosse quello di nn disporre bene i dati nei registri...corregimi se sbaglio...

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Te l'ho detto ... quello che metti in DX:AX lo devi inserire tutto in EAX ...

  10. #10
    è la stessa cosa ke pensavo anke io solo ke ho provato a mettere tutto in eax facendo:
    shl eax,16
    xor ax,ax
    mov ax,dx

    ma durante l'esecuzione mi si impalla quando deve scrivere il numero in formato decimale...

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.