; bubble.asm

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