![]() | ![]() |
|
|
Modi d'indirizzamento
Quando parliamo di modi d'indirizzamento, ci riferiamo a come una locazione di memoria viene indirizzata.
L'8051 dispone dei seguenti modi d'indirizzamnto:
Indirizzamento Immediato |
MOV A,#20h |
Indirizzamento Diretto |
MOV A,30h |
Indirizzamento Indiretto |
MOV A,@R0 |
Esterno Diretto |
MOVX A,@DPTR |
Indiretto a Codice |
MOVC A,@A+DPTR |
Ognuno di quest 636j98g i modi d'indirizzamento fornisce importanti flessibilita'.
Indirizzamento Immediato
L'Indirizzamento Immediato e' chiamato cosi' perche' il valore da memorizzare risiede immediatamente nel codice operativo nella memoria programma. Cio' significa che l'istruzione contiene in se' stessa il valore da memorizzare.
Per esempio, l'istruzione:
MOV A,#20h
usa l'indirizzamento immediato perche' l'accumulatore sara' caricato con il valore che segue immadiatamente (una costante); in questo caso 20 (esadecimale).
L' indirizzamento immediato e' molto veloce poiche' il valore da caricare e' gia contenuto nell'istruzione stessa. Come inconveniente, pero', il valore e' stabilito al momento della compilazione e questo ne limita la flessibilita'.
Indirizzamento Diretto
L'Indirizzamento Diretto e' chiamato cosi' perche' il valore da memorizzare in memoria e' ottenuto direttamente prendendolo da un'altra locazione di memoria.
Per esempio, l'istruzione:
MOV A, 30h
leggera' il valore contenuto nella locazione di RAM interna all'indirizzo 30 (esadecimale) e lo porra' nell'accumulatore.
L'Indirizzamento Diretto e' generalmente veloce, poiche', anche se il valore da caricare non e' incluso nell'istruzione, esso e' comunque facilmente accessibile, in quanto risiede nella memoria interna dell'8051. Esso e' inoltre molto piu' flessibile dell'Indirizzamento Immediato poiche' il valore da caricare e' contenuto in un determinato indirizzo e quindi puo' essere modificato.
Va inoltre notato che, ogni volta che usate l'indirizzamento diretto con valori compresi da 00h a 7Fh fate riferimento alla Memoria Interna. Mentre se usate indirizzi da 80h a FFh fate riferimento ai registri SFR che servono a controllare i modi operativi del microcontrollore stesso.
A questo punto sorge spontanea la domanda; " Se l'indirizzamento diretto nell'area da 80h a FFh fa riferimento ai registri SFR, come posso indirizzare i 128 byte superiori della RAM interna dell'8052?". La risposta e': Non potete usare l'indirizzamento diretto per far riferimento a quell'area di memoria. Ad ogni modo potete accedere a tale parte di RAM usando il prossimo modo d'indirizzamento: quello indiretto.
Indirizzamento Indiretto
L'indirizzamento Indiretto e' un modo molto potente che in molti casi fornisce un elevato grado di flessibilita'. Esso e' inoltre l'unica maniera per accedere ai 128 byte extra della RAM interna dell'8052.
L'indirizzamento indiretto assume la seguente forma:
MOV A,@R0
Questa istruzione dice
all'8051 di analizzare il valore contenuto nel registro R0. In seguito il microcontrollore
carichera' nell'accumulatore il valore contenuto nella RAM interna alla
locazione il cui indirizzo e' contenuto in R0.
Facciamo un esempio: supponiamo che R0 contenga il valore 40h e la RAM interna
all'indirizzo 40h contenga il valore 67h. Al momento dell'esecuzione
dell'istruzione, l'8051 va a leggere l'indirizzo della RAM in R0, poi usa tale
indirizzo per prendere il valore 67h e lo carica nell'accumulatore.
L'indirizzamento indiretto e' sempre riferito alla RAM interna; non e' mai
relativo ad un registro SFR. Qualcuno potrebbe pensare di usare
l'indirizzamento indiretto per scrivere sulla porta seriale (SFR 99h) nella
seguente maniera:
MOV R0,#99h ;Carica in R0 l'indirizzo della porta seriale
MOV @R0,#01h ;Invia 01h sulla porta seriale... SBAGLIATO!
Questa operazione e' concettualmente non valida. Siccome l'indirizzamento indiretto fa sempre riferimento alla RAM interna, le due istruzioni di sopra, scriveranno 01h all'indirizzo 99h dell'8052. Nel caso di un 8051, le due istruzioni produrranno un risultato indefinito, perche' esso dispone di soli 128 byte.
Esterno Diretto
La Memoria Esterna puo' essere usata con un modo d'indirizzamento chiamato "Esterno Diretto". Il suo nome deriva dal fatto che esso e' simile all'indirizzamento diretto, ma e' usato per accedere alla memoria esterna invece che interna.
Ci sono solo due istruzioni che usano questo modo d'indirizzamento:
MOVX A,@DPTR
MOVX @DPTR,A
Come potete notare, ambedue le istruzioni utilizzano DPTR. In queste istruzioni, il registro DPTR deve essere caricato con l'indirizzo della memoria esterna alla quale si vuole accedere. Una volta che il registro DPTR contiene l'indirizzo corretto, la prima istruzione carichera' il valore della memoria nell'accumulatore, mentre la seconda fara' l'operazione opposta, spostando il valore dell'accumulatore nella memoria esterna.
Esterno Indiretto
La memoria esterna puo' anche essere indirizzata usando una forma di indirizzamento indiretto chiamato "esterno indiretto". Questa forma di indirizzamento e' usualmente utilizzata in progetti relitavemente piccoli che hanno una piccola quantita' di RAM esterna.
Un esempio di tale indirizzamento e' il seguente:
MOVX @R0,A
Ancora una volta, il valore di R0 e' usato come indirizzo di memoria esterna dove caricare il valore dell'accumulatore. Poiche' il valore di @R0 puo' soltanto essere incluso nel range da 00h a FFh, il progetto dovrebbe effettivamente avere una RAM esterna di soli 256 byte. Ci sono degli accorgimenti relativamente semplici implementati in hardware/software per accedere a piu' di 256 byte di memoria esterna usando l'indirizzamento in oggetto, comunque risulta piu' facile usare in questi casi l'indirizzamento Esterno Diretto.
Privacy |
Articolo informazione
Commentare questo articolo:Non sei registratoDevi essere registrato per commentare ISCRIVITI |
Copiare il codice nella pagina web del tuo sito. |
Copyright InfTub.com 2025