; ---------------------------------------------------------------------------------
;
; 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
    