|
 |
Le
PseudoOperazioni di MASM |
SCHEDA n° 02 [
14
di 26] |
 |
|
Gestione dei Dati - PUBLIC,
EXTRN |
|
 | Ci sono
2 importanti pseudoOperazioni
destinate sia ai dati (variabili)
che alle procedure, che
consentono all'assemblatore di lasciare al
linker
utili indicazioni per la creazione del codice eseguibile:
 | PUBLIC,
rende un simbolo utilizzabile da ogni (codice)
oggetto unito dal linker ;
naturalmente il nome dell'etichetta dichiarata pubblica
deve essere definito nel nostro programma sorgente. |
 | EXTRN:
dobbiamo dichiarare esterne le
etichette che si riferiscono a variabili
o procedure non definite nel
codice sorgente che stiamo scrivendo; di solito i bytes degli oggetti
esterni sono assunti dal linker da librerie
presenti sulla memoria di massa. Il compilatore annota comunque questi
nomi nella sua Tabella dei Simboli,
lasciando "vuoti" gli indirizzi ad essi relativi, cioè
ponendo a 0 il valore dei 2 bytes che rappresentano l'etichetta.
Per evitare errori nella fase di
collegamento (link) bisogna stare attenti a dichiarare con esattezza il
tipo del simbolo dichiarato esterno, in accordo con la definizione data
ad esso dal modulo che l'ha creata (es: BYTE
per DB, WORD
per DW, e così via); vediamo
alcune dichiarazioni possibili e il modo con cui sono trattate da MASM:
|
EXTRN X_Byte:BYTE ;var. a 8 bit
EXTRN X_Word:WORD ;var. da 2 bytes
EXTRN X_DWord:DWORD;var. da 4 bytes
EXTRN X_Tbyte:TBYTE;var. da 10 bytes
EXTRN X_Numbr:ABS ;num assoluto
EXTRN BIOScls:NEAR ;proc.intrasegment
EXTRN RAMcls:FAR ;proc.extrasegment |
Name
Type Value Attr
X_BYTE V BYTE 0000 External
X_WORD V WORD 0000 External
X_DWORD V DWORD 0000 External
X_TBYTE V TBYTE 0000 External
X_NUMBR NUMBER 0000 Communal
BIOSCLS L NEAR 0000 External
RAMCLS L FAR 0000 External |
 | NB: per ogni simbolo dichiarato EXTRN
dal nostro programma deve esserci, in qualche modulo di libreria, la
definizione di una variabile (o di una procedura) dichiarata PUBLIC,
e viceversa. |
|
 |
|
 | La pseudoOperazione
LABEL non di uso molto frequente
e permette di cambiare il tipo ad una o più variabili elencate subito dopo;
i nuovi tipi possono essere BYTE, WORD,
DWORD, QWORD,
TBYTE, NEAR,
FAR. |
 |
In
uso improprio per la pseudoIstruzione LABEL è utile per
memorizzare in
una etichetta l'indirizzo corrente di un determinato punto del
programma, magari per eseguire dei test; l'esempio mostra come
caricare SI con l'indirizzo dell'istruzione che fa questo:
................
sonoQui LABEL WORD
LEA
SI,sonoQui |
|
 | In pratica con questa direttiva si crea un nuovo
simbolo (etichetta)
con il quale si rende possibile indirizzare la
variabile che segue in modo diverso dal suo, per esempio come
byte invece di word; nello schema seguente vediamo come far diventare di
tipo WORD la variabile ATTRIB, definita
come byte (DB), o come ridefinire come BYTE
la parte bassa della variabile RamVideo, definita come word
(DW):
AttribW
LABEL WORD
ATTRIB DB 0FH
RamVid_B LABEL BYTE
RamVideo DW 0B800H |
MOV
AL,CS:[ATTRIB]
MOV AX,CS:[ATTRIB] [*]
MOV AX,CS:[AttribW]
MOV AX,CS:[RamVIDEO]
MOV AL,CS:[RamVIDEO][*]
MOV AL,CS:[RamVid_B] |
[*]
Possiamo notare che se tentiamo
di accedere alla variabile in modo diverso da quello definito per
essa, senza la LABEL, viene
segnalato errore (warning A4031: Operand types must match).
In realtà l'errore è warning perchè sia l'istruzione rossa che quella
verde fanno comunque la stessa cosa, solo che la prima segnala errore e la
seconda no; la definizione LABEL
serve dunque per evitare la segnalazione d'errore. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|