|
 |
Il Processore e il Debugger |
PROCESSORE 80x86 10/14
[21 di 60] |
 |
|
I Registri Puntatore e i Registri Indice |
|
 | Il processore 8086 prevede 5
registri ufficialmente adatti a costituire la
parte
offset di un
indirizzo logico; di solito sono distinti in
registri puntatore (IP,
SP e BP)
e registri indice (DI e
SI), tutti
a 16 bit, indivisibili. |
 | Il concetto di offset è
stato descritto nella pagina precedente: in sostanza, traducendo dall'inglese,
significa spiazzamento,
spostamento (distanza) da un punto iniziale,
e rende bene l'idea del puntatore interno,
in grado da individuare senza dubbi una qualunque delle possibili 65536
locazioni di un segmento. |
 | La definizione dei registri di
offset non può essere disgiunta dall'accoppiamento con un
registro di segmento, sebbene nessuno ci
vieti di usare ciascuno di questi registri come semplice
deposito dati a 16 bit. |
 | Come in occasione della definizione degli altri registri è comunque
utile ricordare che esiste un modo proprio
di utilizzarli, cioè con gli accoppiamenti suggeriti dal
set delle istruzioni; con questo concetto ben presente vediamoli dunque uno
per uno. |
 | Il registro puntatore
IP (Instruction
Pointer) fa coppia esclusiva con CS,
e viceversa; una coppia assolutamente ...fedele. |
 | Il puntatore logico CS:IP
è assolutamente indispensabile per la vita di ogni programma in esecuzione,
essendo lo strumento (Program Counter) con il
quale il processore punta il (primo) codice operativo dell'istruzione che sta
per essere da lui eseguita. |
 | Si tratta dunque di un registro
completamente gestito dal processore stesso, nel senso che non esiste
istruzione che possa modificarne direttamente il valore; in condizioni
normali viene aggiornato direttamente dalle logiche
interne del processore durante l'esecuzione dell'istruzione da esso
puntata: il numero dei suoi bytes viene semplicemente aggiunto al valore
iniziale, cosicchè IP, al termine
dell'esecuzione, si ritrova correttamente a puntare l'istruzione successiva. |
 | In modo indiretto (ma sempre per intervento del processore)
il suo valore può essere cambiato anche radicalmente dall'esecuzione delle istruzioni JMP
, CALL
o RET ;
in nessun caso è conveniente manipolare in modo diverso il contenuto di questo
registro. |
 | Il registro puntatore
SP (Stack Pointer)
fa coppia esclusiva con SS (sebbene,
all'occorrenza, SS se la possa vedere anche
con
BP,
che vedremo tra poco...). |
 | Il puntatore logico SS:SP
è lo strumento con il quale il processore gestisce lo
Stack,
l'area di memoria nella quale annota gli indirizzi a cui tornare in caso di
esecuzione di CALL
o INT
; in ogni momento punta
la prima locazione disponibile ad essere utilizzata. |
 | Anche questo registro è assolutamente indispensabile per la
vita di ogni programma in esecuzione, e la sua modifica, pur possibile in modo
anche esplicito, può rivelarsi sconveniente, se condotta con leggerezza e
scarsa consapevolezza: i rischi di crash del programma in esecuzione (se non
del computer stesso) sono molto elevati. |
 | Il registro è comunque gestito automaticamente dal
processore in occasione dell'esecuzione di
istruzioni che coinvolgono lo stack, come le coppie CALL/ RET,
INT/ IRET
o PUSH/ POP;
in occasione di queste operazioni il valore del registro
SP viene
decrementato/incrementato di
2 bytes alla volta. |
 | Il registro puntatore
BP (Base Pointer)
fa coppia con SS ma non in assoluto. |
 | Il puntatore logico SS:BP
è talvolta usato dal programmatore per puntare alcuni valori presenti nello stack: si tratta della tecnica di passaggio dei
parametri tramite stack, molto frequente nei linguaggi di
programmazione ad alto livello. |
 | E' facile capire che, intervenendo in un'area di memoria di
solito riservata al processore, ogni operazione deve essere condotta con
estrema attenzione, lasciando inalterato lo stato dei dati gestiti dal
processore e soprattutto il puntatore ufficiale allo
Stack, appunto
SS:SP. |
 | Per questa ragione, sebbene tollerata, l'uso improprio
dello
Stack
deve essere gestito con un secondo puntatore,
SS:BP. |
 | Come ogni altro registro a 16 bit può, comunque, essere
usato senza rischio anche in coppia con DS
o ES, per puntare locazioni di
memoria contenenti normali dati. |
 | I registri indice
SI (Source Index)
e DI (Destination
Index) sono normali registri a 16 bit, sebbene il loro nome
tradisca le funzioni alla quale il set delle istruzioni li destina. |
 | Le coppie di puntatori logici previste
da numerose istruzioni del set sono DS:SI
e ES:DI,
rispettivamente utilizzate per puntare le aree di memoria
da cui prendere (locazioni sorgente,
come in MOVS
, LODS
) e in cui mettere (locazioni
destinazione, come in MOVS
, STOS
) i dati. |
 | Di solito queste potenti istruzioni provvedono anche a
incrementare o decrementare il valore corrente di questi registri: poichè si
tratta di operazioni piuttosto raffinate e impegnative si consiglia di
consultarle direttamente
nelle pagine ad esse dedicate. |
 | Per terminare ricordiamo che, comunque, è ammesso anche
qualunque altro accoppiamento, che risulterà certamente meno efficace di
quelli consigliati; entrambi i registri di segmento, DS e
ES, possono essere usati in coppia con i registri
di offset DI e SI,
ma anche con BP e
BX (quest'ultimo elevato al rango di
puntatore). |
 | Solo per completezza, a partire
dal 80386 sono disponibili registri a 32
bit; i registri puntatori sono detti ESI,
EDI, EBP,
ESP e EIP,
e quelli descritti in questa pagina sono ancora riconosciuti come
loro parte
bassa. |
 | In aggiunta citiamo alcuni tra i nuovi registri, introdotti
nel tempo:
 | i 3 Control Register
80386:CR0,
CR2, CR3. |
 | il Control Register
Pentium:CR4. |
 | i 6 Debug
Register
80386:DR0,
DR1, DR2,
DR3, DR6,
DR7. |
 | i 5 Test
Register
80486:TR3,
TR4,
TR5,
TR6,
TR7. |
 | i Model Specific
Register
Pentium: MSR. |
 | i Memory Type & Range
Register
PentiumPro:
MTRR. |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|