Per quanto riguarda le modalità di indirizzamento, dove inizia un offset?

0

Quindi una modalità di indirizzamento è il modo in cui viene specificato un operando (da quello che ho capito) e ci sono diverse modalità fornite da diverse architetture, come la modalità Immediata, la modalità indiretta di registrazione, ecc.

In quel contesto, incontro frequentemente una specifica di un offset, come nella modalità diretta in cui specifichi l'offset dell'operando direttamente nell'istruzione come ADD AL,[0301] - ma un offset da cosa? Ci deve essere un indirizzo di base o qualcosa su cui si basa l'offset? C'è qualche posto di partenza, come un indirizzo di un'istruzione?

    
posta asd 12.02.2018 - 14:04
fonte

1 risposta

0

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.

    
risposta data 12.02.2018 - 16:55
fonte

Leggi altre domande sui tag