|
 |
Gli strumenti di Lavoro |
ASSEMBLATORE 3/17
[22 di 87] |
|
Aggiornato 18
settembre 2006 |
 |
|
Come l'Assemblatore tratta le Etichette? |
|
 | Ci sono alcuni aspetti dell'assemblatore che
devono essere messi in evidenza:
 | legge e interpreta
ogni
parola del sorgente Asm, sostituendola con
codice
macchina (se è lo mnemonico di una
istruzione, come
JMP
o MOV)
o con servizi per migliorare il
prodotto finale (se è una direttiva,
come ORG).
Il numero di bytes di
codice
macchina dipende dall'istruzione da codificare: raramente
basta solo il codice operativo (cioè solo
un byte) ma si può arrivare anche a 6
bytes per istruzione... |
 | ritiene etichette
tutte le altre parole non incluse nelle sue Tabelle
di Conversione: le etichette sono
indirizzi
espressi in forma simbolica; uno dei compiti
dell'assemblatore è proprio quello di predisporre la loro raccolta
nella Tabella delle Etichette (o
Tavola
dei Simboli).
|
|
 | Solo per
fissare le idee va sottolineato che,
nella colonna ad esse dedicata, le etichette
possono essere definite con o
senza i :
(2 punti):
 | quelle
non terminate con
:
(2 punti), di solito definite al di
fuori della sequenza delle istruzioni, sono relative a:
|
 | quelle
terminate con
:
(2 punti) sono necessarie per
identificare indirizzi importanti
del programma, ovviamente definite in punti non prevedibili all'inizio; si
tratta di punti a partire dai quali
si definiscono procedure del
programma o verso i quali è
necessario saltare |
|
 | In entrambi i casi
il compilatore provvede a calcolare il valore corrente del contatore di programma
corrispondente all'indirizzo della
linea di programma in cui è rilevata l'etichetta, e ad inserirne il
valore
direttamente in Tabella. |
 |
Per
completare la traduzione di un codice sorgente l'assemblatore deve
compiere "2 passate" (cioè deve leggere il
testo 2 volte):
 |
nella prima
scansione
si occupa solo di creare
la Tavola dei Simboli,
cioè annota tutte le etichette che trova e associa loro i
rispettivi valori |
 |
solo nella seconda
scansione crea
il codice macchina,
avendo a disposizione tutti i dati necessari per compilarlo (i
bytes del codice mnemonico:dalle Tabelle
Interne di Conversione
e quelli delle etichette dalla Tavola
dei Simboli,
ora completa. |
|
 | Naturalmente le informazioni assunte durante
la prima passata serviranno per garantire un indirizzo alle etichette
presenti
a destra dei rispettivi mnemonici,
intese come
operandi delle
istruzioni:
 | di salto
(JMP) o di
chiamata (CALL),
di solito relativi a etichette con i
:
(2 punti)
finali |
 | di gestione
memoria (come
MOV
o
ADD
o altro...), di solito relativi a
etichette senza i
:
(2 punti)
finali, perchè associate (come detto) per esempio a variabili |
|
 | Al termine delle 2
passate l'assemblatore
rende disponibile un codice
oggetto quasi funzionate
(il file OBJ) nel quale:
 | le etichette
operando delle istruzioni
CALL
(relative agli enty
point delle procedure)
saranno codificate con un valore
nullo 0000H, pur rendendo
disponibile il loro indirizzo nella
Tavola
dei Simboli e un marcatore
in grado di ricordare che si tratta di un indirizzo interno
rilocabile. |
 | le etichette
operando delle istruzioni
JMP
(o
Jxx,
relative ai punti a cui saltare)
saranno sostituite direttamente nel codice
macchina da un numero con segno
rappresentante la distanza (in bytes) dal punto di programma in cui è
definita l'etichetta stessa; per questa codifica è prevista una coppia
di bytes per cui:
 |
se la distanza tra i punti è breve
(NEAR)
e l'etichetta è definita dopo la
linea di programma, sarà necessario un numero
a 16 bit compreso tra 3
(0003H) e 32767 (7FFFH), in pratica il numero di bytes
tra
l'istruzione che usa l'etichetta come operando e quella che definisce
l'etichetta (esclusi i bytes
necessari per definirle) |
 |
se la distanza tra i punti è breve
(NEAR)
e l'etichetta è definita prima
della linea di programma, sarà sarà necessario un
numero a 16 bit compreso tra 32768
(8000H) e
-3 (FFFCH), in pratica il numero di bytes tra
l'istruzione che usa l'etichetta come operando e quella che definisce
l'etichetta (compresi i bytes
necessari per definirle) |
 | se
la distanza tra i punti topici è vicina
(SHORT)
basterà un numero a 8 bit compreso tra 3
(03H) e 127
(7FH) [con etichetta definita
dopo] o tra
128 (80H) e
-3 (FCH)
[con etichetta definita prima]; in
questo caso,
poichè il terzo bytes previsto dal codice
mnemonico non è necessario, l'assemblatore lo codifica con 90H, NOP |
|
|
 | Può succedere, infine, che talune istruzioni citino
etichette
non presenti nel programma;
in questo caso il
loro valore non è noto e l'assemblatore:
 | provvederà a
codificarle con un valore nullo
0000H e ad associare al loro nome
lo stesso valore, nella Tavola
dei Simboli, marcandolo
in modo di ricordare che si tratta di un indirizzo interno
esterno |
 | pretende però che queste etichette
fantasma siano dichiarate
EXTRN
prima della sequenza
delle istruzioni; si tratta certamente di
procedure (EXTRN
BioChr1:near) o
variabili (EXTRN
Variab8:byte o
EXTRN Variab16:word)
definite in librerie esterne,
che saranno assunte solo dopo la successiva fase
di link (i famosi riferimenti irrisolti...) |
|
 |
 |
L'uso
delle Etichette è una magia dell'assemblatore;
senza di esse sarebbe necessario calcolare e annotarsi gli
indirizzi di tutti i punti importanti del nostro programma
(come
succedeva durante i nostri primi esercizi, assemblando in
ambiente Debug); |
 |
Già
questa operazione è certamente paranoica, ma la pazzia
sarebbe assicurata se, per una improrogabile necessità,
fossimo costretti a inserire nuove istruzioni in qualunque
punto del codice sorgente: sarebbe necessario
ricalcolare tutti gli indirizzi da capo! |
 |
Meglio
dunque lasciar fare all'assemblatore, nella sua ormai famosa
prima passata! |
|
 | Per rendere
eseguibile il codice e
comunque necessario l'intervento del
linker,
al quale spetta il compito di sostituire gli indirizzi provvisori
0000H con quelli effettivi, calcolati a
partire da quelli presenti nella Tavola
dei Simboli se di tipo rilocabile
interno, o a partire dall'indirizzo in cui le
procedure esterne sono state importate,
se si tratta di un riferimento marcato esterno. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|