| NEAR,
FAR: questi operatori
sono di norma scritti insieme alle direttive
EXTRN,
LABEL
e PROC
o in aggiunta ad altri operatori, PTR
e THIS,
per stabilire in quale segmento sono definiti gli oggetti che hanno questo
attributo; nel primo caso le variabili o le procedure sono definite nel
medesimo segmento (vicine) del programma
principale; nel secondo
appartengono invece a segmenti diversi (lontane):
EXTRN BIOScls:NEAR ;proc. intrasegmentale
EXTRN RAMcls:FAR
;proc. extrasegmentale
sonoQui LABEL NEAR
Main
PROC NEAR
sonoQui EQU THIS FAR
CALL FAR PTR
sonoQui |
Una
curiosità: l'operatore
TYPE, usato per esempio dall'istruzione
MOV AX,TYPE Main, restituisce il numero
0FFFFH, se l'indagine è condotta (come in questo caso) su etichette NEAR oppure 0FFFEH se invece l'etichetta è definita
FAR. |
| Vale la pena ricordare che per indirizzare
oggetti NEAR basta la parte offset
(una sola word) di un indirizzo logico, dato che il segmento
è in comune tra loro, mentre per i FAR serve l'indirizzo logico completo (segment:offset,
per esempio CS:IP se si tratta di
procedure o DS:SI se tratta di
dati). |
| LOW,
HIGH: questi operatori
restituiscono rispettivamente il byte meno
significativo (parte bassa) e
quello più significativo (parte
alta) di una espressione numerica costante
a 16 bit:
MOV AL,LOW
1122H ; mette 22H in AL
MOV AL,HIGH
1122H ; mette 11H in AL |
|
| OFFSET:
questo operatore è utile perché
consente di risalire alla parte offset
dell'indirizzo di un simbolo (variabile o entry-point) definito
nel segmento; l'istruzione che usa l'operatore è piuttosto lunga, per cui
l'Autore preferisce affidarsi al codice mnemonico LEA,
che fa' la stessa cosa in modo più sintetico; nell'esempio entrambe le
istruzioni lasciano in SI l'indirizzo della Tabella:
Tabella
DB 01H
MOV SI,OFFSET
Tabella
LEA
SI,Tabella |
|
| SEG:
questo operatore permette di conoscere
il valore della parte segment dell'indirizzo
di un simbolo (variabile o entry-point) definito nel segmento; l'esempio
proposto lascia in AX e
BX lo stesso numero esadecimale a 16bit,
corrispondente al valore del segmento (il primo libero..) in cui è stato
caricato il programma dal loader:
_prog SEGMENT BYTE PUBLIC 'CODE'
..........
ATTRIB DB 0FH
Main
MOV
BX,SEG ATTRIB
MOV AX,SEG
_prog |
|
| SHORT:
questo operatore consente di ridurre
a 2 il numero di bytes necessari per compilare i salti
assoluti (di solito 3):
l'operazione riesce solo se tra il punto in cui c'è l'istruzione di salto e
il punto di arrivo sono presenti meno di 127 bytes in avanti o 128 bytes indietro, altrimenti viene
segnalato errore (error A2053: Jump out of range by
nnn byte(s)). Conviene sempre provare a
fare salti corti: se il compilatore si offende... basta levare la parola SHORT
e la compilazione si conclude senza errori:
JMP SHORT xxx00
;...meno di 128 bytes
xxx00: NOP |
|