PDA

View Full Version : [Assembler] controindicazioni istruzione DIV su 16 bit?


xblitz
24-12-2007, 14:27
Salve a tutti
stò creando un programma assembler che dato in input un numero n stampi a video l'ennesimo numero della sequenza di Fibonacci, il mio problema è nella stampa a video del numero:

in pratica per far stampare la cifra opero una divisone per 10000, poi 1000, 100 e 10, infine stampo le unità... il mio problema arriva nella stampa delle migliaria: quando vado a fare la seconda divisione (quella delle migliaia) ottengo dei valori "corrotti".

Mi sono fatto un'idea: mi sono accorte che un flag (per esattezza il flag P) passa da 0 a 1, potrebbe essere lui il responsabile?

uso il turbo debugger assembler 8086

posto il pezzo di codice incriminato:


scambia macro
mov BX,DX
mov DX,AX
mov AX,BX
endm

stampa proc
;salvo i registri che verranno modificati
push AX
push BX
push CX
push DX

mov AX,BX ;sposto il dividento (che è SEMPRE AX)

;decine di migliaia
mov BX,10000d ;sposto il divisore in BX
div BX ;così sono sicuro di avere una divisione su
registri a 16bit quoziente in AX resto in
DX
scambia ;la cifra da stampare è in AX, quindi la
metto in DX
add DL,48d ;recupero lo sfalsamento cifra carattere
push AX ;AX viene modificato -> devo salvarlo
mov AH,2 ;carico il servizio di input
int 21h ;il contenuto che legge va in AL
pop AX ;ripristino AX

;migliaia
mov BX,1000d ;sposto il divisore in BX
div BX ;così sono sicuro di avere una divisione su
registri a 16bit quoziente in AX resto in
DX
scambia ;la cifra da stampare è in AX, quindi la
metto in DX
add DL,48d ;recupero lo sfalsamento cifra carattere
push AX ;AX viene modificato -> devo salvarlo
mov ah,2 ;carico il servizio di input
int 21h ;il contenuto che legge va in AL
pop AX ;ripristino AX

.....


Grazie in anticipo....
Ciao!

andbin
24-12-2007, 15:41
quando vado a fare la seconda divisione (quella delle migliaia) ottengo dei valori "corrotti". Occhio che quando fai DIV BX stai facendo una divisione 32 bit diviso 16 bit cioè:

DX:AX diviso BX

e in AX ottieni il quoziente e in DX ottieni il resto.

cionci
24-12-2007, 15:44
Giusto, quindi devi azzerare DX prima di fare la divisione ;)

xblitz
24-12-2007, 19:33
:ave:
GRAZIE a tutti e 2... (se solo avessi letto gli appunti del prof con più attenzione :doh: :doh: :doh: :muro: :muro: :muro: :muro: ) ma scusate quei ":" in pratica vogliono dire "concatenazione"giusto? così mi pare di aver capito dagli appunti :stordita:

andbin
24-12-2007, 22:56
(se solo avessi letto gli appunti del prof con più attenzione :doh: :doh: :doh: :muro: :muro: :muro: :muro: )Basta leggere la documentazione ufficiale Intel, che è sicuramente più completa e valida degli appunti del tuo prof. ;)

ma scusate quei ":" in pratica vogliono dire "concatenazione"giusto? così mi pare di aver capito dagli appunti :stordita:Sì, esatto. Vale anche nel caso di segmento/offset, es. DS:98AFH o CS:EIP.