| Notiamo subito che
non ci sono
riferimenti irrisolti, cioè tutte le
etichette coinvolte come operando nelle
istruzioni (presenti a destra dei rispettivi
mnemonici, nell'esempio JMP
e
CALL)
sono definite dentro il codice ASM, come
previsto, nella prima colonna a sinistra (vedremo che, in caso contrario,
sarà necessario coinvolgere la direttiva
EXTRN
per assicurare la compilabilità del programma). |
| In ogni caso l'indirizzo iniziale dal quale comincia la compilazione è di norma
indicato dalla direttiva
ORG:
nel nostro esempio (ORG
0100H) il primo byte della
prima istruzione sarà dunque associato all'indirizzo
0100H
(pari a 256, in decimale, sebbene convenga abituarsi a considerare
irrilevante questa precisazione), valore con cui sarà caricato anche il
contatore di programma, cioè il
registro IP (Instruction
Pointer) con cui la CPU punterà le istruzioni da eseguire. Vediamo che cosa succede:
| prima istruzione
(INIZIO: JMP Main):
| l'assemblatore riconosce
la parola INIZIO
come etichetta
e le associa subito il valore corrente del contatore (0100H). |
| la parola che segue (JMP,
salto) deve essere
contenuta nella
tabella
di conversione: naturalmente la trova e le associa subito il numero (codice operativo) E9H
o EBH di solito ad essa associato |
| poiché sa che la parola JMP corrisponde ad un'istruzione che ha bisogno di un operando
che esprime un indirizzo, annota la parola che segue (Main)
e poiché non conosce ancora il numero esadecimale a 16 bit che le
corrisponde (deve ancora trovare l'etichetta
con il
medesimo nome) la traduce momentaneamente con i 2 bytes 00H,
00H; l'istruzione
è comunque codificata con 3 bytes
|
| come
decritto qui in dettaglio,
è curioso osservare come l'assemblatore sia in grado di capire (prima di
ultimare il suo lavoro) se si tratta di un salto
vicino (NEAR, nel range 32767 in avanti e 32768 indietro) o
corto (SHORT, nel range 127 in avanti e
128 indietro) |
| nel primo caso
l'istruzione è codificata con codice operativo E9H
seguito da una word con segno |
| nel secondo caso
l'istruzione è codificata con codice operativo EBH
seguito da un byte con segno; poichè il terzo
bytes previsto dal codice mnemonico non è necessario, l'assemblatore lo
codifica con 90H,
NOP. |
| in entrambi i casi sia
la word che il byte
esprimono il numero di locazioni da saltare in avanti o indietro per
raggiungere la locazione associata all'etichetta
(Main,
nel nostro caso) |
| poiché sa che l'istruzione JMP Main
è comunque codificata con 3 bytes (E9H,
loH,
hiH o EBH,
xyH,
90H) aggiorna il
contatore portandolo
al valore 0103H (appunto 0100H + 3) |
|
| seconda
istruzione (KeyWait: MOV AH,00H ;Aspetta la pressione):
| la parola KeyWait
è riconosciuta come etichetta:
l'assemblatore le associa subito il numero corrente del
contatore (0103H). |
| la parola che segue (MOV)
viene trovata in tabella; l'assemblatore capisce che si tratta di
un'istruzione che ha diverse possibilità di codifica e stabilisce il
corretto codice operativo in funzione
dei 2 operandi che seguono: se le parole che seguono
sono AH,00H
il codice operativo che corrisponde alla
stringa è B4H e il secondo operando è
numerico, il byte 00H. |
| nella analisi della riga di istruzione
trova
;Aspetta la pressione,
ma non cerca di interpretarne il significato perchè è istruito ad
ignorare qualunque stringa Ascii successiva a ;
(punto e virgola),
ritenendola un commento. |
| poiché sa che l'istruzione
MOV AH,00H
è esprimibile con 2 bytes (B4H,
00H) aggiorna il
contatore
portandolo
al valore 0105H (appunto 0103H + 2).
|
|
| Tutte le altre
istruzioni sono trattate con la medesima filosofia. |
|