; ord_selez.asm

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