Как говорится в некоторых других ответах, ключевое слово offset
относится к смещению от сегмента, в котором оно определено. Обратите внимание, однако, что сегменты могут перекрываться, и смещение в одном сегменте может отличаться в другом сегменте. Например, предположим, что у вас есть следующий сегмент в реальном режиме
data SEGMENT USE16 ;# at segment 0200h, linear address 2000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
Ассемблер видит, что foo
находится со смещением 0100h
от основания data SEGMENT
, поэтому везде, где он увидит offset foo
, он поместит значение 0100h
, независимо от значения DS
в данный момент.
Например, если мы изменим DS
на что-то другое, чем основание сегмента data
, ассемблер предполагает:
mov ax, 200h ; in some assemblers you can use @data for the seg base
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; foo = 10
mov ax, 300h
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; bar = 10, not foo, because DS doesn't match what we told the assembler
Во втором примере DS
равно 0300h
, поэтому основание сегмента, на которое указывает DS
, равно 03000h
. Это означает, что ds:[offset foo]
указывает на адрес 03000h + 0100h
, который совпадает с 02000h + 01100h
, который указывает на bar
.
person
Nathan Fellman
schedule
03.11.2009