PDA

Visualizza la versione completa : [ASSEMBLY] Conversione di una word a 32 bit in codice ASCII


faster589
30-06-2007, 16:39
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?!

faster589
30-06-2007, 17:36
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... :bh: :bh:

frizzo28
01-07-2007, 12:51
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

faster589
01-07-2007, 15:15
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?!

oregon
02-07-2007, 12:06
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 ...

faster589
02-07-2007, 12:25
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...

oregon
02-07-2007, 12:33
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.

faster589
02-07-2007, 12:33
...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...

oregon
02-07-2007, 12:35
Te l'ho detto ... quello che metti in DX:AX lo devi inserire tutto in EAX ...

faster589
02-07-2007, 12:37
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...

Loading