Wie einige der anderen Antworten sagen, bezieht sich das Schlüsselwort offset
auf den Offset des Segments, in dem es definiert ist. Beachten Sie jedoch, dass Segmente sich überlappen können und der Offset in einem Segment in einem anderen Segment unterschiedlich sein kann. Zum Beispiel: Angenommen, Sie das folgende Segment im Real-Modus
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
und Blick auf den folgenden Code haben:
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
Der Assembler sieht, dass foo
bei Offset ist 0100h
von der Basis des data SEGMENT
, so wohin es sieht offset foo
es wird den Wert 0100h
setzen, unabhängig von dem Wert von DS
zu der Zeit.
Im zweiten Beispiel ist DS
0300h
, so dass die Grundfläche des Segments, auf dem durch DS
03000h
ist. Dies bedeutet, dass ds:[offset foo]
auf die Adresse 03000h + 0100h
zeigt, was dasselbe ist wie 02000h + 01100h
, was auf bar
zeigt.
edit: korrigierten logische Fehler in Code