Procedure 8086

di il
6 risposte

Procedure 8086

Buonasera a tutti e grazie in anticipo,
Sono nuovo nella programmazione in assembly e sto trovando difficoltà nella gestione delle procedure. Cercando di essere il più chiaro e preciso possibile vi scrivo cosa esattamente dovrei fare:
"Realizzare una procedura in grado di ordinare sul posto un vettore di interi a 16 bits. La procedura dovrà essere richiamabile da un programma esterno e ricevere l'indirizzo del vettore e la sua lunghezza come parametri variabili attraverso lo stack"
Non ho problemi sull'ordinamento del vettore però non so come far ricevere l'indirizzo del vettore e la sua lunghezza come parametri attraverso lo stack.

6 Risposte

  • Re: Procedure 8086

    Ti potrei suggerire qualche documento su internet

    https://courses.engr.illinois.edu/ece390/books/artofasm/CH11/CH11-4.html

    Prova a dare una soluzione anche in funzione di qualche esempio fatto dal tuo docente ...
  • Re: Procedure 8086

    Il problema è che il mio professore l'ho visto si e no mezza volta
    In ogni caso lui fa una cosa del genere:
    
    proc _sort 
              push bp
              push bp, sp
              dec cx
              shl cx
              sub si, si
              sub di, di
    loop_i:
              mov di, si
              add di, 2              ; j=i+1
    loop_j:
              mov dx, [bx + si]  ; DX= arr[i]
              mov ax, [bx + di]  ; AX = ARR[J]
              cmp dx, ax          ; IF ( arr[i] <= arr[j]) then no swap
              jle noswap
              mov [bx + si], ax   ; else swap
              mov [bx + di], dx
    no_swap:
              add di,2
              cmp di,cx
              jbe loop_j
    
              add si,2
              cmp si,cx
              jb loop_i
              
              pop bp
              ret
    endp
    
    
    però non ho capito in che punto gli passa i parametri :S
  • Re: Procedure 8086

    Infatti, manca qualcosa ...

    Dai un'occhiata a questo codice d'esempio e cerca di risolvere facendo le tue osservazioni e prove ...
    
            mov     ax, Y
            lea     bx, userMsg
            push    bx
            push    ax
            call    example  ; Y, offset userMsg
            add     sp,4
    
    
    example proc
            push    bp                    ;save bp
            mov     bp,sp                 ;set bp = sp
    ;                                     ;2[bp] = return address
    ;                                     ;4[bp] = first parameter
    ;                                     ;6[bp] = second parameter
            mov     dx,6[bp]              ;display message
            mov     ah,09h
            int     21h
    ;       ...
            pop     bp
            ret
    
  • Re: Procedure 8086

    Occhei, credo di aver capito, praticamente io pusho i valori che mi servono che, essendo di 16 bits mi occupano due posti nello stack, setto il Base Pointer dello stack all'inizio della procedura ed in automatico BP+4 e BP+6 prendono il valore rispettivamente di ax e bx pushati in precedenza. Quello che non mi è chiaro è in BP+2 cosa ci va a finire, l'indirizzo di cosa? Scusami le domande ma ho molto bisogno di comprensione
  • Re: Procedure 8086

    ;2[bp] = return address

    L'indirizzo di rientro dalla proc.

    Saprai che quando viene chiamata una proc il processore memorizza nello stack l'indirizzo da cui deve riprendere l'esecuzione al termine della proc stessa ...
  • Re: Procedure 8086

    Ah ok! Tutto chiaro! Giustamente al termine delle operazioni tutto quello che è scritto dopo il BP della procedura lo devo buttare a mare Perfetto! Tutto chiaro!

    GRAZIE!
Devi accedere o registrarti per scrivere nel forum
6 risposte