2009-11-03 23 views

risposta

15

Come alcune delle altre risposte dicono, la parola chiave offset si riferisce allo scostamento dal segmento in cui è definito. Si noti, tuttavia, che i segmenti potrebbero sovrapporsi e che l'offset in un segmento potrebbe essere diverso in un altro segmento. Per esempio, si supponga di avere il seguente segmento in modalità reale

data SEGMENT USE16 ;# at 02000h 

    org 0100h 
    foo db 0 

    org 01100h 
    bar db 0 

data ENDS 

e guardare il seguente codice:

mov ax, 2000h 
mov ds, ax 

mov bx, offset foo ; bx = 0100h 
mov byte ptr [bx], 10 ; foo = 10 

mov ax, 3000h 
mov ds, ax 

mov bx, offset foo; bx = 0100h 
mov byte ptr [bx], 10 ; bar = 10 

L'assemblatore vede che foo è all'offset 0100h dalla base di data SEGMENT, così, ovunque Vede offset foo inserirà il valore 0100h, indipendentemente dal valore di DS al momento.

Nel secondo esempio DS è 0300h, quindi la base del segmento puntato da DS è 03000h. Ciò significa che ds:[offset foo] punta all'indirizzo 03000h + 0100h che corrisponde a 02000h + 01100h, che punta a bar.

modifica: errore logico corretto nel codice

6

Significa solo l'indirizzo di quel simbolo. È un po 'come l'operatore & in C, se si ha familiarità con quello.

1

In modalità x86 a 16 bit, lo spazio indirizzo non è piatto; invece, gli indirizzi sono composti da un offset e da un "segmento". Il "segmento" punta a uno spazio di 64 KB, l'offset è all'interno di quello spazio.

Vedi http://en.wikipedia.org/wiki/Memory_segmentation

3

offset significa che si registro sarà uguale all'offset della variabile value1 (non al suo valore effettivo). Offset è l'indirizzo dall'inizio del segmento di memoria in cui è memorizzata la variabile. L'offset è in genere relativo al segmento ds (nel tuo caso i registri ds e cs puntano allo stesso segmento).

1

offset è fondamentalmente la distanza dal punto di segmento (detto anche punto di riferimento). ad esempio l'indirizzo del segmento è 0000 e l'offset o l'indirizzo logico è 0100, quindi l'indirizzo fisico può essere contato aggiungendo le due coppie. indirizzo fisico = 0000 + 0100 = 0100 significa che il nostro punto desiderato è sull'indirizzo del 0100. Allo stesso modo, se indirizzo di segmento è 1DDD e Offset è 0100 allora: Indirizzo fisico è: 1DDD + 0100 = 1EDD

Means che la nostra destinazione è 1EDD.