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
fonte
2009-11-03 20:02:43