Ciao a tutti sono nuovo del forum
, premetto che ho cominciato a programmare da poco in assembly e sono un auto didatta (se notate qualcosa di anomalo o alquanto inconsueto ditemelo, ve ne sarò grato
), ho questo problema: vorrei ordinare in maniera ascendente un vettore precaricato con valori fissi e poi stamparlo a video. il programma mi si blocca appena stampo la stringa "testo"; l'ultima parte del programma, ovvero la stampa del vettore funziona, dunque il problema deve essere per forza nell'ordinamneto;
Questo è il sorgente:
.model small
.stack
.data
vettore DB '5 ','12 ','8 ','0 ','-9 ','-3 ','18 ','$'
testo DB "Ordinamento di un vettore precaricato$"
.code
INIZIO:
MOV AX,SEG testo ;stampo stringa titolo
MOV DS,AX
LEA DX,testo
MOV AH,09H
INT 21H
MOV AH,00H ;pausa schermo
INT 16H
LEA SI,vettore
CICLO: MOV AX,SI ;inizializzo puntatore SI all'inizio del vettore
INC AX
MOV DI,AX ;inizializzo puntatore DI a SI+1 (posizione successiva del vettore)
CMP DS:[SI],'$' ;se SI=$ il vettore è stato scorso tutto
JZ FINE
CICLO2: CMP DS:[DI],'$' ;se DI=$ bisogna riinizializzare i contatori con la posizione successiva
JZ INCR_SI
MOV AX,DS:[DI]
CMP DS:[SI],AX ;se l'elemento puntato nel vettore è più grande del successivo effettuo lo scambio
JA SCAMBIO
JMP INCR_DI
SCAMBIO:MOV AX,DS:[SI] ;queste quattro MOV effettuano lo scambio nel vettore con AX d'appoggio
MOV BX,DS:[DI]
MOV DS:[SI],BX
MOV DS:[DI],AX
INCR_DI:INC DI
JMP CICLO2
INCR_SI:INC SI
JMP CICLO
FINE: LEA SI,vettore
STAMPO: MOV DL,DS:[SI] ;stampo i caratteri nel vettore finche non incontro il $
CMP DL,'$'
JZ OK
MOV AH,02H
INT 21H
INC SI
JMP STAMPO
OK: MOV AH,00H ;pausa schermo
INT 16H
MOV AH,4CH
INT 21H
END
Ho provato a caricarmi in memoria l' .exe generato con il debug e ad analizzarlo con il comando "t", ho notato che al momento del confronto del valore attuale nel vettore con il $ (CMP DS:[SI],'$' , CMP DS:[DI],'$'), quando tale istruzione risultava VERA, la flag Zero NON veniva settata ad 1!
perchè questo??
Grazie mille in anticipo!
Valerio.