| Dunque in funzione della tecnica
d'accesso ad un determinato dato; vediamo i possibili di modi
di indirizzamento:
| tra registri:
il dato è contenuto in un registro e viene semplicemente travasato in
un altro registro (es: MOV
AX,BX); si tratta del metodo più
veloce possibile dato che il processore trova già dentro se stesso le
informazioni necessarie per eseguire l'istruzione; naturalmente non è
possibile coinvolgere registri di dimensione diversa. |
| immediato:
il dato è indicato direttamente dall'istruzione e viene inserito nel
registro specificato (es: MOV
AX,1234H); sebbene la presenza del
numero nella sintassi dell'istruzione possa indurre un pensiero di immediatezza
anche nell'esecuzione, dobbiamo pensare che il dato costante
è, in realtà, scritto nella memoria di
programma (cioè quella puntata da CS:IP)
dopo il codice operativo: per questo
il processore è costretto ad eseguire uno o più accessi in memoria (a
seconda della dimensione del dato) per prelevarlo e porlo nella coda
d'istruzione, prima di sistemarlo:
| dentro se stesso, in un registro MOV AX,1234H). |
| in memoria MOV
[Depo02],1234H); in questo caso
la costante assunta dalla memoria di
programma dovrà essere spostata nella memoria
dati (cioè puntata per default da DS:Offset,
ma anche in altro segmento, se si impone esplicitamente un override,
MOV
CS:[Depo02],1234H). |
|
| diretto:
il dato è localizzato dall'etichetta
specificata direttamente dall'istruzione, ed è coinvolto (in lettura o
in scrittura) con un registro di dimensione uguale a quella
dell'operando diretto stesso (es: MOV
AX,Depo02); bisogna sottolineare che:
| l'etichetta non
rappresenta l'indirizzo del dato ma il dato
stesso!, cioè il dato contenuto
nella locazione puntata da quell'indirizzo; per questo, sebbene la
sintassi proposta come esempio sia perfettamente legale,
personalmente preferisco educarmi a scriverla così MOV
AX,[Depo02]: poiché il
compilatore la riconosce allo stesso modo mi
sembra una scelta più vicina alla realtà. |
| l'altro operando deve avere la stessa
dimensione del dato associato all'etichetta (con
DB o DW o DD,
nella riga di programma che definisce la variabile); in caso
contrario è necessario utilizzare l'operatore
Byte o Word o Dword
(per esempio per trasferire in AL solo la parte bassa della word
memorizzata inDepo02
bisogna scrivere MOV
AL,Byte Ptr [Depo02]) |
|
| indiretto tramite registro:
il dato è localizzato con l'aiuto di un registro di Offset, di solito SI
o DI ma anche altri registri a 16
bit:
| la sintassi di queste istruzioni (es: MOV
AX,[SI]) è, in questo caso, meno
ambigua, dando con le parentesi quadre,
il senso di contenuto della locazione
puntata da SI (o
qualunque altro registro). |
| per altro, se l'operando sorgente è
una costante, è assolutamente necessario specificare anche la dimensione del dato,
con l'operatore
Byte o Word o Dword Ptr,
per evitare segnalazioni d'errore da parte dell'assemblatore,
per esempio: MOV
Byte Ptr [Si],100) |
|
| indiretto tramite registro
e spiazzamento:
il dato è localizzato sommando il
contenuto di un registro indice,
SI
o DI, o base,
BX o BP,
con il numero esadecimale con segno a 8 o a 16 bit, specificato
nell'istruzione, detto displacement
(spiazzamento) (es: MOV
AX,[SI+10]):
| la somma del contenuto dei registri
con il numero fornito punta una locazione nel segmento DS
se i registri coinvolti sono SI,
DI o BX,
e nel segmento SS se il registro
è BP. |
| l'utilità di questo metodo è
evidente quando è necessario scorrere una tabella in modo dinamico,
a partire da un certo punto; per esempio con la MOV
AX,[Depo02+SI] basta cambiare il
valore corrente di SI per
assumere, una dopo l'altra, le word contenute nella tabella Depo02 |
|
| indiretto tramite registro
indice e base e
spiazzamento:
il dato è localizzato sommando il
contenuto di un registro indice,
SI
o DI, con uno base,
BX o BP,
e con il numero esadecimale con segno a 8 o a 16 bit, specificato
nell'istruzione, detto displacement
(spiazzamento) (es: MOV
AX,[SI+BX+10]):
| la somma del contenuto dei registri
con il numero fornito punta una locazione nel segmento DS
se il registro base coinvolto è BX,
e nel segmento SS se invece è BP. |
| questa ulteriore opzione rende ancora
più versatile la gestione dinamica delle tabelle. |
|
|