Procedure In assembler
Le fasi In assembler abbiamo due fasi: Dichiarazione e Definizione Viene definito il nome (indirizzo) della procedura Vengono presentate le istruzioni che fanno parte di questa 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 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 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 pop dx pop ax ret ENDP