| il progetto di una procedura coinvolge il programmatore in
uno sforzo una-tantum, ben ripagato dal
fatto che il suo lavoro sarà riutilizzabile in molte altre occasioni, con
notevole risparmio di tempo |
| per assicurarsi il servizio di una procedura basta infatti
una sola istruzione, di norma la
CALL |
| per la sua definizione si utilizzano le direttive
PROC
e ENDP,
all'interno delle quali sono raccolte le istruzioni chiamate a svolgere il
compito affidato al sottoprogramma; ciascuna delle due direttive sarà
preceduta dal nome scelto per la procedura |
| dopo la direttiva
PROC si specifica il
tipo di
procedura che si desidera progettare,
Near
o Far;
nel primo caso la procedura può essere chiamata solo all'interno del
segmento di codice di definizione, mentre
nel secondo la procedura può essere chiamata anche a
partire da
segmenti di codice diversi da quello di
definizione |
| una procedura
Near (intrasegmentale)
può essere definita anche senza queste formalità, semplicemente aggiungendo
: (due punti) dopo il suo
nome |
| per assicurarsi il servizio di una procedura basta una sola
istruzione, di norma la
CALL |
| il tipo e il
numero di istruzioni che raccoglie è
irrilevante; di certo l'ultima dovrà
essere l'istruzione
RET |
| la presenza della RET
finale consente al processore di rientrare nel programma
chiamante, subito sotto l'istruzione (CALL
Nome_Proc) che ha eseguito la chiamata |
| il rientro è reso possibile dal fatto che l'istruzione
CALL ha
salvato nello
stack l'indirizzo dell’istruzione a
sé successiva (la sola parte offset, se di
tipo Near,
o quello completo segment:offset,
se di tipo Far)
e che l'istruzione RET
lo ha recuperato nei
medesimi registri puntatori di programma (solo IP,
se Near,
o CS:IP,
se Far) |
| è possibile differenziare il funzionamento di una procedura
passandole parametri; un
parametro è di norma un valore binario
predisposto dal programma chiamante in registri o
variabili locali, condivise con la procedura |
| anche la procedura può lasciare eventuali
risultati in
registri o variabili locali, condivise con
il programma chiamante |
| in generale, in queste operazioni di scambio, la
disponibilità dei registri è ovviamente
estremamente limitata rispetto a quella delle variabili
locali, pressocché infinite |