Se stai guardando lo smontaggio di un programma in esecuzione, ad esempio da un debugger, una modalità di memoria assoluta potrebbe essere esattamente quella. Nel tuo caso sarebbe l'indirizzo 301 nello spazio degli indirizzi del processo in fase di debug.
Tuttavia, in alcuni processori esiste un registro della CPU che fornisce l'indirizzo di base per gli accessi ai dati.
Ad esempio, il processore 8086, che è una versione estesa di un processore a 16 bit per consentire l'accesso a uno spazio di indirizzi a 20 bit. L'estensione è fasulla, in quanto combinano due valori a 16 bit per calcolare un indirizzo a 20 bit (quindi, 32 bit vengono utilizzati per produrre un indirizzo a 20 bit!).
La formula è indirizzo a 20 bit = porzione di segmento * 16 + porzione di offset.
Nell'accedere ai dati, ad esempio, il processore mantiene un registro chiamato DS
per contenere il segmento di base, e nelle istruzioni si specifica solo l'offset, che apparirà nella forma come se fosse una modalità di indirizzamento diretto / assoluto, sebbene il processore calcoli effettivamente DS:offset
(che è il modo in cui scrivono la formula per calcolare un indirizzo a 20 bit da un registro di segmento e un valore di offset).
Il codice assembly potrebbe essere simile a:
dataSeg segment data
...
xyz db 5
...
quindi nel codice
mov ax, dataSeg #1
mov ds, ax
...
mov al, offset [xyz] #2
...
mov ax, offset xyz #3
mov bl, [ax] #4
Si noti che in # 1 il regsiter DS
viene caricato con il valore del segmento dati dichiarato in una direttiva di segmento (sequenza di due istruzioni, poiché DS è limitato nelle istruzioni che lo utilizzano). La prima introduzione utilizza ciò che chiameremmo una modalità immediata, poiché non è possibile accedere alla memoria reale.
Successivamente, in # 2, chiediamo al processore di caricare un byte in AL
da DS:offset xyz
dove DS
contiene l'indirizzo di segmento di dataSeg
. L'istruzione specifica solo offset [xyz]
e non la parte del segmento. Probabilmente lo chiameremmo modalità di indirizzamento diretto / assoluto, poiché vi è un coinvolgimento immediato come parte di un calcolo di indirizzo per un'interazione (qui un byte letto) con memoria. Si potrebbe sostenere che questa è una modalità di indirizzamento offset di base +, tranne per il fatto che la base è un registro implicito.
In # 2, chiediamo al processore di caricare l'offset stesso piuttosto che eseguire un recupero di memoria; l'offset è caricato in AX
. Questa sarebbe una modalità di indirizzamento immediata, dal momento che la memoria non è effettivamente accessibile.
Nel n. 4 utilizziamo l'offset caricato da # 3, quindi il recupero del byte dalla memoria in BL
deriva da DS:AX
. Potremmo chiamare questo semplicemente indiretto. Di nuovo, si potrebbe sostenere che questo è indice di base +, tranne che la base è il registro di segmento implicito.
Una volta che la famiglia x86 è passata ai registri a 32 bit (ad esempio 80386 e oltre), ha eliminato la maggior parte di quel segmento / materiale offset. Pertanto, l'indirizzamento diretto / assoluto è più semplice e i valori si riferiscono agli indirizzi nello spazio degli indirizzi.
Tuttavia, altri processori hanno utilizzato un registro dedicato per il riposizionamento del segmento di dati in fase di caricamento.