Procedure In assembler Le fasi • In assembler abbiamo due fasi: o Dichiarazione e Definizione • Viene definito il nome (indirizzo) della procedura • Vengono presentate le istruzioni che fanno parte di questa o Esecuzione • Viene “chiamata” la procedura • Possono esistere più chiamate della stessa procedura Dichiarazione e Definizione • Sintassi <nome_procedura> PROC <istruzioni> RET <nome_procedura> ENDP • Esempio VaiACapo PROC MOV AH, 2 MOV DL, 13 INT 21h MOV DL, 10 INT 21h RET VaiACapo ENDP Commento alla dichiarazione • Il nome della procedura rappresenta l’indirizzo di partenza del codice • L’istruzione RET termina l’esecuzione della procedura e ritorna il controllo al programma chiamante • La procedura va inserita dopo la fine del programma o all’inizio, ma in tal caso deve essere “saltata” • Il nome della procedura deve essere significativo • E’ opportuno inserire un commento sul comportamento della procedura • Eventuali LABEL interne alla procedura non devono interferire con label del resto del programma o Suggerimento: usare un prefisso per le label che “ricordi” il nome della procedura Chiamata della procedura • • • • Sintassi CALL <nome_procedura> Esempio CALL VaiACapo • CALL trasferisci il controllo alla procedura • In un programma possono essere presenti più istruzioni di CALL alla stessa procedura e anche CALL a procedure diverse • Una procedura può essere chiamata all’interno di un’altra procedura Lo stack • • • Lo stack è una zona di memoria utilizzata per memorizzare valori temporanei. Lo stack segue la logica LIFO (Last In First Out) cioè l’ultimo elemento inserito è il primo a essere tolto dallo stack. Per esempio una pila di monete può dare l’idea del funzionamento dello stack: la prima moneta che viene prelevata è quella posta in “testa” alla pila cioè l’ultima che era stata inserita Procedure e stack • L’istruzione CALL inserisce nello stack l’indirizzo della prossima istruzione da eseguire nel programma chiamante (IP) • L’istruzione RET “recupera” dallo stack l’indirizzo dell’istruzione da eseguire nel programma chiamante Salvataggio temporaneo dei registri • Una procedura può avere come effetto collaterale quello di modificare i valori di alcuni registri. • Per evitare problemi è possibile inserire sullo stack i valori di questi registri all’inizio della procedura per poi recuperarlo alla fine di questa. • Per inserire un valore sullo stack si utilizza l’istruzione PUSH • Per recuperare e togliere un valore dallo stack si utilizza l’istruzione POP • Attenzione alla logica LIFO ! Un esempio VaiACapo PROC push ax push dx mov ah,2 mov dl, 13 int 21h mov dl, 10 int 21h pop dx pop ax ret ENDP