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!