|
 |
Differenza
tra Macro e Procedure |
SCHEDA n° 03 [
4
di 4] |
 |
|
Che differenza c'è tra PROCEDURE e MACRO? |
|
 | Siamo pronti per tirare le somme: abbiamo la consapevolezza
che sia le Procedure che le
Macroistruzioni sono strutture molto utili... |
 | Il problema da risolvere è: quando
conviene usare le prime in alternativa alle seconde? |
 | Se abbiamo letto con attenzione quanto detto finora, la risposta non dovrebbe
essere difficile; entrambe rendono più
leggibile il codice sorgente (non solo assembly) e riducono gli
errori di programmazione, ma sono estremamente
diverse tra loro! |
 | Per arrivare alla soluzione conviene rivedere le
considerazioni precedenti in una prospettiva di confronto e con
spirito di osservazione. |
 | Una Procedura è una zona di
programma inalterabile,
specializzata e di norma
versatile, cioè in grado di
fare cose simili ma diverse, in funzione dei
valori predisposti in uno o più registri prima della sua chiamata; ti voglio
proporre 3 esempi molto significativi (ma l'aspetto del
passaggio dei parametri è visibile in
molti altri casi):
 | la
BIOchr1 mette a
video un carattere, il cui codice ascii deve
essere predisposto nel registro
AL prima di chiamarla |
 | la
SET_cur fissa la
posizione di stampa corrente di ogni cosa messa a video,
sulla base dei valori predisposti nei
registri
DL (colonna) e
DH (riga) prima di chiamarla |
 | la
BIOSmsg stampa
(nella posizione di stampa corrente) la stringa Ascii
puntata dall'indirizzo predisposto nel
registro
SI prima di chiamarla |
|
 | La chiamata di una procedura è
quasi sempre inutile se non si provvede a inizializzare uno o più registri prima della sua chiamata; dunque:
 | se è necessario mettere a video un
carattere non possiamo fare a meno delle 2 istruzioni:
MOV AL,'A'
e
CALL BIOchr1 |
 | se è dobbiamo fissare la posizione
di stampa non possiamo fare a meno delle 3 istruzioni:
MOV DL,12,
MOV DH,0
e
CALL SET_cur |
 | se bisogna stampare una stringa
Ascii non possiamo fare a meno delle 2 istruzioni:
LEA SI,Testo01
e
CALL BIOSmsg |
|
 |
Quando una Procedura
non può
essere chiamata senza
averle anteposte una o più istruzioni di inizializzazione, è il
momento di creare una Macro! |
 | La conclusione logica delle precedenti considerazioni si
riflette nella creazione di altrettante Macro, una per ciascun servizio:
 | la
M_chr carattere, il cui corpo
conterrà le 2 istruzioni necessarie per mettere a video un
carattere predisposto nel parametro
carattere |
 | la
M_CURSOR
riga, colonna, il cui corpo conterrà le 3
necessarie per fissare la
posizione di stampa corrente suggerita dai
parametri riga,
colonna |
 | la
M_msgN
Testo, il cui corpo conterrà le 2
istruzioni necessarie per stampare la stringa Ascii
puntata dal parametro
Testo |
|
 | Ecco come potrebbero essere definite le 3 macro: |
M_Chr
MACRO carattere
MOV AL,carattere
CALL BIOchr1
ENDM |
M_CURSOR
MACRO
riga,colonna
MOV
DL,colonna
MOV DH,riga
CALL SET_cur
ENDM |
M_msgN
MACRO Testo
LEA SI,Testo
CALL BIOSmsg
ENDM |
 | Dopo aver definito le 3 Macro
(all'inizio del sorgente ASM) sarà possibile sostituire le istruzioni
presentate 3 punti fa con una sola riga di programma per ciascun gruppo:
 | le 2 istruzioni per mettere a video
il
carattere "A" saranno sostituite dalla pseudo-istruzione:
M_Chr "A" |
 | le 3
per fissare la
posizione di stampa sulla riga0, colonna 12 saranno sostituite
dalla pseudo-istruzione:
M_CURSOR 0,12 |
 | le 2
istruzioni per stampare la stringa Testo01
saranno sostituite dalla pseudo-istruzione:
M_msgN Testo01 |
|
 | In sostanza la presenza di una Macroistruzione
in un sorgente ASM non cambia nulla, se non
esteticamente e
funzionalmente; la quantità di bytes prodotta dal compilatore è
esattamente identica ma il codice risulterà più compatto e breve. |
 | Avrai notato che i parametri
da associare ai vari registri sono semplicemente
elencati uno dopo l'altro, separati da una virgola, sottolineando una
volta di più la potenza di questa struttura |
 |
L'uso corretto di una Macro è
quello di organizzare la chiamata di una Procedura:
il suo compito è quello di sostituire (con una sola riga di programma)
il gruppo di istruzioni necessarie per inizializzarla; la cosa che
non fa risparmiare memoria
di programma (il
codice macchina prodotto dall'assemblatore è sempre lo stesso)
ma rende più leggibile il programma. |
|
Scheda n° 03 |
|
|
Differenza
tra Macro e Procedure |
|
 |
 |
 |
| Scheda n° 03 -
4
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|