|
 |
Le
PseudoOperazioni di MASM |
SCHEDA n° 02 [
07
di 26] |
 |
|
Gestione delle MacroIstruzioni - LOCAL |
|
 | Vediamo ora di sottolineare un
possibile problema di sintassi: quando nel corpo della macro
sono presenti etichette d'indirizzo è necessario dichiarale prima del corpo con la
pseudoOperazione LOCAL. |
 | Sebbene la riga contenente la Macroistruzione,
tra le altre del programma, dia la sensazione di eleganza e compattezza, non bisogna dimenticare
l'assemblatore la sostituirà con le
istruzioni del suo corpo ogni volta che viene chiamata in causa (anche molte
volte nell'ambito del programma sorgente). |
 | Per mostrare questo effetto ho creati l'inedita Macro
M_Test: nell'esempio seguente la viene
chiamata 2 volte: osserviamo (a destra, in forma ridotta) come MASM
ha codificato il listato:
M_Test
MACRO Dato
LOCAL mmm1
MOV AL,Dato
CMP AL,12H
JZ mmm1
XOR AL,AL
mmm1: MOV AH,00H
ENDM
-----------------------
INIZIO: NOP
M_Test
20H
NOP
M_Test
30H
NOP |
14
0100 INIZIO: NOP
15
M_Test 20H
16 0104 1 MOV
AL,Dato
17 0106 1
CMP AL,12H
18 0108 1
JZ ??0000
19 011A 1
XOR AL,AL
20 0118 1 ??0000: MOV
AH,00H
21 010E NOP
22
M_Test 30H
23 010F 1 MOV
AL,30H
24 0111 1 CMP
AL,12H
25 0113 1
JZ ??0001
26 0115 1
XOR AL,AL
27 0117 1 ??0001: MOV
AH,00H
28 0119 NOP |
|
 | Per la presenza di LOCAL,
l'etichetta originaria mmm1
è stata sostituita con un simbolo fatto
con 2 punti di domanda e un numero
progressivo, ??0000;
il numero viene incrementato ogni volta che l'assemblatore deve sostituire
l'etichetta di una Macro, indipendentemente dal suo nome corrente e dalla
Macro che la utilizza. |
 | Così, nell'esempio, la medesima etichetta mmm1
è stata chiamata ??0000
la prima volta e ??0001
la seconda; in questo modo
l'assemblatore rende unici i
simboli a riferimenti dello stesso tipo. |
 | Se non avessimo dichiarato LOCAL
mmm1 il compilatore, costretto a
scrivere 2 volte il testo della Macro esattamente come è stato definito,
già nella prima passata avrebbe trovato l'etichetta mmm1
scritta 2
volte (segnalando error A2004: Redefinition of symbol),
mentre nella seconda passata avrebbe segnalato 2 errori (error A2026: Reference to multidefined symbol
e error A2005: Symbol is
multidefined: MMM1) ogni volta che
avrebbe incontrato mmm1
(cioè 2
volte...). |
 |
|
Gestione delle MacroIstruzioni - .XALL,
.LALL, .SALL |
|
 | A margine della discussione delle PseudoOperazioni
destinate alla Gestione delle MacroIstruzioni, sebbene di interesse e
utilizzo relativamente scarso, ne citiamo alcune create per il controllo
dei commenti eventualmente scritti nel corpo della Macro:
 | se non viene specificata nessuna di queste
direttive (condizione di default) è come se fosse stata data la
direttiva .XALL; in questo
caso nel listato
vengono mostrate solo le righe di codice e non i commenti (come negli
esempi precedenti). |
 | la direttiva .LALL
(List All) obbliga MASM a scrivere,
nel listato, tutto quello che è stato definito nel corpo della Macro,
esclusi i commenti forniti dopo 2 punto e virgola, ;;. |
 | infine la direttiva .SALL
(Suppress ALL) permette di evitare
di scrivere nel listato le righe dell'espansione. |
|
 | L'azione prodotta dalle 3 direttive sulle
chiamate della Macro M_Dato si
vede chiaramente dal listato seguente:
1
.XALL ; non è necessaria (default)
2 M_Dato
MACRO Dato
3
; commento controllabile
4
;; commento che non sarà mai visibile
5
ADD AL,Dato
6
XOR AL,AL
7
ENDM
-------------------------------------------------------
13 0100 INIZIO: NOP
14
M_Dato 20H
15 0104 1 ADD AL,20H
16 0106 1 XOR AL,AL
17
.LALL ; mostra tutto, compresi commenti
18
M_Dato 20H
19 1
; commento controllabile
20 1
;
21 0108 1 ADD AL,20H
22 010A 1 XOR AL,AL
23 010C NOP
24
.SALL ; non mostrare l'espansione Macro
25
M_Dato 20H
26 0111 NOP |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|