in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

Ordinamento ascendente vettore

Ultimo messaggio ricevuto il 30-12-2008 10.13 da devspy. 1 risposta(e).
Pagina 1 di 1 (2 elemento/i)
Ordina messaggi: Precedente Successivo
  • 09-12-2008 12.50

    Ordinamento ascendente vettore

    IdeaCiao a tutti sono nuovo del forum Cool, premetto che ho cominciato a programmare da poco in assembly e sono un auto didatta (se notate qualcosa di anomalo o alquanto inconsueto ditemelo, ve ne sarò gratoSmile), ho questo problema: vorrei ordinare in maniera ascendente un vettore precaricato con valori fissi e poi stamparlo a video. il programma mi si blocca appena stampo la stringa "testo"; l'ultima parte del programma, ovvero la stampa del vettore funziona, dunque il problema deve essere per forza nell'ordinamneto;

    Questo è il sorgente:

    .model small
    .stack
    .data

    vettore  DB '5 ','12 ','8 ','0 ','-9 ','-3 ','18 ','$'
    testo  DB "Ordinamento di un vettore precaricato$"
    .code

    INIZIO: 

     MOV AX,SEG testo ;stampo stringa titolo
     MOV DS,AX
     LEA DX,testo
     MOV AH,09H
     INT  21H
     
     MOV AH,00H  ;pausa schermo
     INT 16H

     LEA SI,vettore 
     
    CICLO: MOV AX,SI  ;inizializzo puntatore SI all'inizio del vettore
     INC  AX
     MOV DI,AX  ;inizializzo puntatore DI a SI+1 (posizione successiva del vettore)
     CMP DS:[SI],'$' ;se SI=$ il vettore è stato scorso tutto
     JZ FINE
    CICLO2: CMP DS:[DI],'$' ;se DI=$ bisogna riinizializzare i contatori con la posizione successiva
     JZ INCR_SI
     MOV AX,DS:[DI]
     CMP DS:[SI],AX ;se l'elemento puntato nel vettore è più grande del successivo effettuo lo scambio
     JA SCAMBIO  
     JMP INCR_DI
    SCAMBIO:MOV AX,DS:[SI] ;queste quattro MOV effettuano lo scambio nel vettore con AX d'appoggio
     MOV BX,DS:[DI]
     MOV DS:[SI],BX
     MOV DS:[DI],AX
    INCR_DI:INC  DI 
     JMP CICLO2
    INCR_SI:INC SI
     JMP CICLO

    FINE: LEA  SI,vettore

    STAMPO: MOV DL,DS:[SI] ;stampo i caratteri nel vettore finche non incontro il $
     CMP DL,'$'
     JZ OK
     MOV AH,02H
     INT  21H
     INC SI
     JMP STAMPO

    OK: MOV AH,00H  ;pausa schermo
     INT 16H

     MOV AH,4CH
     INT 21H

    END

     Ho provato a caricarmi in memoria l' .exe generato con il debug e ad analizzarlo con il comando "t", ho notato che al momento del confronto del valore attuale nel vettore con il $ (CMP DS:[SI],'$' , CMP DS:[DI],'$'), quando tale istruzione risultava VERA, la flag Zero NON veniva settata ad 1! Confused perchè questo??

     Grazie mille in anticipo!

    Valerio.

    • Log
  • 30-12-2008 10.13 In risposta a

    Re: Ordinamento ascendente vettore

    Non so se può fare al caso tuo, ma su Yahoo! Answers trovi questo ritaglio di codice:

    sort proc
    ;INPUT- DS:SI = array to sort
    ; CL = # of bytes in array

    dec cl ;CL = inner loop counter
    mov ch,cl ;copy CL
    mov dl,cl ;DL = outer loop counter
    mov di,si ;copy SI

    outloop:
    mov si,di ;reset SI
    mov cl,ch ;reset CL

    inloop:
    mov ax,word ptr ds:[si]
    cmp al,ah
    jbe noswap
    rol ax,8
    mov word ptr ds:[si],ax

    noswap:
    inc si
    dec cl
    jnz inloop
    dec dl
    jnz outloop
    ret
    sort endp
    Archiviato in:
    • Log
Pagina 1 di 1 (2 elemento/i)
Prelevato da http://www.devspy.com/forums/p/4824/6210.aspx
DevSpy.com 6.0 © 2001-2010 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"