Comme le disent certaines réponses, le mot-clé offset
fait référence au décalage du segment dans lequel il est défini. Notez toutefois que les segments peuvent se chevaucher et que le décalage d'un segment peut être différent dans un autre segment. Par exemple, supposons que vous avez le segment suivant en mode réel
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
Et regardez le code suivant:
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'assembleur voit que foo
est à l'offset 0100h
de la base de data SEGMENT
, de sorte que chaque fois il voit offset foo
il mettra la valeur 0100h
, indépendamment de la valeur de DS
à l'époque.
Dans le second exemple DS
est 0300h
, de sorte que la base du segment pointé par DS
est 03000h
. Cela signifie que ds:[offset foo]
points à l'adresse 03000h + 0100h
qui est le même que 02000h + 01100h
, qui indique bar
.
edit: erreur corrigée dans le code logique