Che cosa OFFSET in codice assembly a 16 bit significa?
Domanda
sto attraversando qualche esempio di codice assembly per la modalità reale a 16 bit.
ho incontrato le righe:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
Che cos'è questo facendo? Che cosa significa aver 'OFFSET' lì che fare?
Soluzione
Come alcune delle altre risposte dicono, la parola chiave offset
si riferisce allo spostamento dal segmento in cui è definito. Si noti, tuttavia, che i segmenti possono sovrapporsi e l'offset in un segmento possono essere diverse in un altro segmento. Per esempio, si supponga di avere il seguente segmento in modalità reale
data SEGMENT USE16 ;# at segment 0200h, linear address 2000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
L'assemblatore vede che foo
è 0100h
compensato dalla base di data SEGMENT
, così ovunque vede offset foo
inserisce l'0100h
valore, indipendentemente dal valore della DS
al momento.
Ad esempio, se cambiamo DS
a qualcosa di diverso alla base del segmento data
l'assemblatore sta assumendo:
mov ax, 200h ; in some assemblers you can use @data for the seg base
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; foo = 10
mov ax, 300h
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; bar = 10, not foo, because DS doesn't match what we told the assembler
Nel secondo esempio DS
è 0300h
, quindi la base del segmento puntato da DS
è 03000h
. Ciò significa che i punti ds:[offset foo]
al 03000h + 0100h
indirizzo che è lo stesso come 02000h + 01100h
, che indica bar
.
Altri suggerimenti
E 'solo significa che l'indirizzo di quel simbolo. E 'un po' come l'operatore & in C, se si ha familiarità con questo.
offset
significa che registro si
sarà uguale all'offset della variabile valore1 (non al suo valore effettivo). Offset è l'indirizzo a partire dall'inizio del segmento di memoria in cui è memorizzato il variabile. L'offset è di solito rispetto al ds
segmento (nel tuo caso ds
e cs
registri siano rivolti allo stesso segmento).
Da di MASM Programmer Guide 6.1 (Microsoft Macro Assembler)
Il OFFSET Operatore
Una costante di indirizzo è un particolare tipo di operando immediato che si compone di un valore di offset o segmento. L'operatore OFFSET restituisce l'offset di una locazione di memoria, come illustrato di seguito:
mov bx, OFFSET var ; Load offset address
Per informazioni sulle differenze tra MASM 5.1 comportamento e MASM 6.1 comportamenti relativi a OFFSET, vedere l'Appendice A.
Poiché i dati in diversi moduli possono appartenere ad un singolo segmento, l'assembler non può sapere per ogni modulo i veri offset all'interno di un segmento. Così, l'offset per var, anche se un valore immediato, non è determinato fino al momento di collegamento.
Se si legge con attenzione, il valore finale è determinato dopo aver "link" il codice oggetto per creare una DLL / EXE. Prima di collegamento, tutto quello che hai è un valore immediato che rappresenta l'offset dall'indirizzo base del segmento.
In modalità 16bit x86, spazio di indirizzi non è piatta; invece, gli indirizzi sono composti da un offset e un "segmento". I punti di "segmento" ad uno spazio 64K, offset è all'interno di quello spazio.
Offset è fondamentalmente la distanza dal punto di segmento (detto anche punto di riferimento). per esempio indirizzo di segmento è 0000 e l'indirizzo di offset o logica è 0100 quindi l'indirizzo fisico può essere conteggiato sommando le due coppie. Indirizzo fisico = 0000 + 0100 = 0100 Significa che la nostra posizione è necessaria sull'indirizzo del 0100. Allo stesso modo se l'indirizzo di segmento è 1DDD e offset è 0100, allora: indirizzo fisico è: 1DDD + 0100 = 1EDD
Significa che la nostra destinazione è 1EDD.