Jak mówią niektóre inne odpowiedzi, słowo kluczowe offset
odnosi się do przesunięcia z segmentu, w którym zostało zdefiniowane. Należy jednak zauważyć, że segmenty mogą się nakładać, a przesunięcie w jednym segmencie może być inne w innym segmencie. Na przykład, załóżmy, że masz następujące segment w trybie rzeczywistym
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
Spójrz na poniższy kod:
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
Assembler widzi, że foo
jest przesunięcie 0100h
od podstawy data SEGMENT
, więc gdziekolwiek widzi offset foo
będzie wstawiać wartość 0100h
, niezależnie od wartości DS
w tym czasie.
W drugim przykładzie DS
jest 0300h
, więc podstawą segmentu wskazywanego przez DS
jest . Oznacza to, że ds:[offset foo]
wskazuje na adres 03000h + 0100h
, który jest taki sam jak 02000h + 01100h
, co wskazuje na bar
.
edit: poprawione błąd logiczny w kodzie