Como dicen algunas de las otras respuestas, la palabra clave offset
se refiere al desplazamiento del segmento en el que está definido. Sin embargo, tenga en cuenta que los segmentos pueden superponerse y el desplazamiento en un segmento puede ser diferente en otro segmento. Por ejemplo, suponga que tiene el segmento siguiente en modo real
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
Y mira el siguiente código:
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
El ensamblador ve que foo
es en desplazamiento 0100h
desde la base de data SEGMENT
, así que donde quiera ve offset foo
pondrá el valor 0100h
, independientemente del valor de DS
en el momento.
En el segundo ejemplo DS
es 0300h
, por lo que la base del segmento apuntado por DS
es 03000h
. Esto significa que ds:[offset foo]
apunta a la dirección 03000h + 0100h
que es lo mismo que 02000h + 01100h
, que apunta a bar
.
edit: error lógico corregido en código