Stack SEGMENT
DB 20 DUP(?)
Stack ENDS
Dati SEGMENT
Vett DB 3,6,2,5,0,4,1,8,9,7
Aus DB ?
Scambio DB ?
Dati ENDS
Codice SEGMENT
ASSUME CS:Codice
Inizio:
MOV AX,Dati ; fa' puntare DS al segmento Dati
MOV DS,AX
LEA BX,Vett
RipetiCiclo:
MOV Scambio,0d
MOV SI,0h
CicloScan:
MOV AL,Byte Ptr[BX + SI]
MOV AH,Byte Ptr[BX + SI + 1]
CMP AL,AH
JBE NonScambia
CALL Scambia ; chiama la routine per effettuare lo scambio
NonScambia:
INC SI ; sposta il puntamento sul vettore in aventi di 1
CMP SI,9d ; avanza fino all'elemento 8 (nono elemento)
JB CicloScan ; se SI e' inferiore a 9 continua
; alla fine della scansione controlla se c'e' stato scambio
CMP Scambio,1d
JE RipetiCiclo ; se si',allora ripete la scansione
; (= vettore non ancora ordinato)
MOV AH,4Ch ; ritorno al DOS
INT 21h
Scambia PROC NEAR
; in questa parte effettua lo scambio tra due
; locazioni contigue, utilizzando i valori gia' immagazzinati
; nei registri AL e AH
MOV Byte Ptr[BX + SI],AH
MOV Byte Ptr[BX + SI + 1],AL
MOV Scambio,1d ; setta il flag che indica lo scambio effettuato
RET
Scambia ENDP
Codice ENDS
END Inizio