; ---------------------------------------------------------------------------------
;
; A. Veneziani - Programma Assembly 8086 per ordinamento di elementi per selezione
;
; ---------------------------------------------------------------------------------
Dati SEGMENT
Vett_Valori DB 6,3,1,5,2,4,9,0,8,7 ;0,3,6,1,9,8,7,5,2,4
Minimo DB ?
PosMinimo DB ?
Ausiliare DB ?
Dati ENDS
Codice SEGMENT
Inizio:
MOV AX,Dati ; settaggio della posizione di DS
MOV DS,AX
; individua l'indirizzo di inizio del vettore Vett_Valori e lo punta con BX
MOV BX,Offset Vett_Valori
Ordina:
; posiziona l'indica di scansione per la ricerca del minimo all' inizio
; del vettore di ricerca (che ha base BX)
MOV SI,0h
; ipotizza che il primo elemento (non ordinato) sia il minimo
MOV AL,[BX]
MOV Minimo,AL
; setta la posizione del minimo ipotizzato
; (prima posizione della parte non ordinata)
MOV AX,SI
MOV PosMinimo,AL
; calcola quanti cicli di ricerca deve fare il programma
; per trovare un nuovo minimo (da inserire in testa) e mette il valore in CX
MOV AX,10d
SUB AX,BX
MOV CX,AX
; individua il minimo nel vettore (non ordinato) -----------------------------
; BX -> 10, costituito dagli ultimi 10 - BX elementi
Ciclo:
MOV AL,Minimo
CMP AL,[BX + SI]
JNA NonCambiare
; effettua un cambio del minimo (nuovo minimo)
; e rileva la posizione dalla quale il nuovo minimo e' stato rilevato
MOV AL,[BX + SI]
MOV Minimo,AL
MOV AX,SI
MOV PosMinimo,AL ; ricava la posizione dell'ultimo minimo
NonCambiare:
INC SI ; avanza il puntatore ad una posizione successiva
LOOP Ciclo
; ------------------------------------------------------------------------------
; scambio dei valori tra la prima posizione corrente (BX) ----------------------
; e la posizione di minimo trovata (PosMinimo)
MOV AX,0h ; porta a 0 tutto il registro
MOV AL,PosMinimo ; carica la posizione di minimo nella parte bassa di AX
MOV DI,AX ; imposta un registro indice di modo da puntare alla posizione di minimo
MOV AL,[BX + DI] ; scambio tra la cella [BX] e quella [BX + SI]
MOV Ausiliare,AL
MOV AL,[BX]
MOV [BX + DI],AL
MOV AL,Ausiliare
MOV [BX],AL
; ------------------------------------------------------------------------------
INC BX ; sposta BX ed esclude dalla ricerca un altro elemento
; controlla se ha raggiunto il penultimo elemento del vettore
; (quando accade termina il ciclo esterno)
CMP BX,Offset Vett_Valori + 8d
JNE Ordina
MOV AH,4Ch ; uscita al DOS
INT 21h
Codice ENDS
END Inizio