PROCEDURE
Le procedure sono porzioni di programma che possono essere richiamate per svolgere un determinato compito ed hanno alcuni vantaggi:
- Rendono il programma più strutturato;
- Rendono il programma più semplice da comprendere in quanto più chiaro;
- Consentono di risparmiare tempo e spazio.
L’esecuzione di una procedura si effettua con un’apposita istruzione di chiamata di procedura simile al salto incondizionato. La definizione inizia e termina con una direttiva.
Sintassi: <nome_procedura> PROC
…
;corpo della procedura
…
<nome_procedura> ENDP
Dove <nome_procedura> rappresenta il nome assegnato alla procedura e va specificato in apertura ed in chiusura, PROC e ENDP rappresentano direttive.
La chiamata di una procedura viene effettuata tramite l’istruzione CALL e la sintassi è la seguente: CALL <nome_procedura>, mentre il ritorno da una procedura viene effettuato tramite l’ istruzione RET.
Vediamo un piccolo esempio:
#MAKE_COM#
ORG100H
MOV AX, 3
MOV BX, 2
CALL MOLTIPLICA
RET
MOLTIPLICA PROC
MUL BX
RET
MOLTIPLICA ENDP
PASSAGGIO DI PARAMETRI
La procedura chiamante può passare in entrata alla procedura chiamata alcuni valori, detti parametri mentre procedura chiamata può passare in uscita alcuni parametri alla procedura chiamante.
I possibili metodi con cui i parametri vengono trasferiti alle procedure si caratterizzano in due categorie fondamentali:
- Trasferimento per valore: la procedura chiamante passa a quella chiamata una copia del valore del parametro;
- Trasferimento per riferimento: la procedura chiamante passa alla procedura chiamata l’indirizzo di memoria del parametro.
Vediamo un esempio di trasferimento per valore:
#MAKE_COM#
ORG 100H
MOV AX, 10
MOV BL, VAR
CALL MOLTIPLICA
RET
VAR DB 2
MOLTIPLICA PROC
MUL BX
RET
MOLTIPLICA ENDP
Vediamo ora un esempio di trasferimento per riferimento:
#MAKE_COM#
ORG 100H
MOV AX, 10
MOV BX, OFFSET VAR
CALL MOLTIPLICA
RET
VAR DB 2
MOLTIPLICA PROC
MUL [BX]
RET
MOLTIPLICA ENDP
PASSAGGIO DI PARAMETRI TRAMITE STACK
Lo stack è un’area di memoria utilizzata per immagazzinare informazioni temporanee come ad esempio:
- Risultati parziali di un calcolo;
- Indirizzo di ritorno di una procedura;
- Parametri di una procedura.
Lo stack ha un accesso di tipo LIFO (Last In First Out), ciò vuol dire che l’ultimo dato inserito è il primo ad essere estratto. Per scrivere o leggere dallo stack si usano due istruzioni aspposite, ovvero PUSH e POP.
Sintassi: PUSH<op1>, POP<op1>, dove OP1 è un registro a 16 bit. Per passare i parametri tramite lo stack occorre effettuare le istruzioni PUSH subito prima della chiamata della procedura, vediamo un pratico esempio:
#MAKE_COM#
ORG 100H
MOV AX, 10
MOV BX, 3
PUSH AX
PUSH BX
MOV AX, 0
MOV BX, AX
CALL MOLTIPLICA
POP BX
POP AX
RET
MOLTIPLICA PROC
PUSH BP
MOV BP, SP
MOV AX, [BP+6]
MOV BX, [BP+4]
MUL BX
POP BP
RET
MOLTIPLICA ENDP
MACRO
La macro è un nome simbolico che il programmatore assegna ad una sequenza di istruzioni, sono simili alle procedure, ma esistono solo in tempo di compilazione.
Quando il codice viene compilato, il codice della macro viene inserito solo laddove la macro viene richiamata, i vantaggi sono:
- Maggiore efficienza;
- Poco spreco di spazio;
- Aumenta la leggibilità.
A differenza delle procedure, le macro vanno dichiarate all’ inizio del programma ed inoltre non hanno bisogno di istruzioni di chiamata. La sintassi per dichiarare una macro è la seguente:
<nome_macro> MACRO [parametri]
…
;corpo della macro
…
ENDM
Ora esaminiamo due spezzoni di codici equivalenti, con e senza dichiarazione di macro:
;START NO MACRO
#MAKE_COM#
ORG 100H
MOV AX, 10
MOV BX, AX
ADD BX, AX
MUL BX
RET
;END NO MACRO
;START MACRO
EXM MACRO PAR1
MOV AX, PAR1
MOV BX, AX
ADD BX, AX
MUL BX
ENDM
#MAKE_COM#
ORG 100H
EXM 10
RET
;END MACRO
Siamo arrivati alla fine di questo corso di programmazione in Assembly, grazie per averci seguito! Se ti sei perso lo scorso articolo, si è parlato del Flusso di esecuzione.
Stai cercando altre guide? Allora dai uno sguardo alla nostra raccolta dedicata alla Programmazione Assembly.
Alla prossima!