Что означает OFFSET в 16-битном ассемблерном коде?
Я рассмотрю примерный код сборки для 16-битного реального режима.
Я натолкнулся на строки:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
что это делает? Что делает "СМЕЩЕНИЕ"?
Извините, если это очень простой вопрос, я новичок в этом.
Ответы
Ответ 1
Как утверждают некоторые другие ответы, ключевое слово offset
относится к смещению от сегмента, в котором он определен. Обратите внимание, однако, что сегменты могут перекрываться, и смещение в одном сегменте может быть другим в другом сегменте. Например, предположим, что у вас есть следующий сегмент в реальном режиме
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
И посмотрите на следующий код:
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
Ассемблер видит, что foo
находится в смещении 0100h
от базы data SEGMENT
, поэтому, где бы он ни находился, offset foo
, он будет помещать значение 0100h
, независимо от значения DS
на время.
Во втором примере DS
есть 0300h
, поэтому основание сегмента, на которое указывает DS
, равно 03000h
. Это означает, что ds:[offset foo]
указывает на адрес 03000h + 0100h
, который совпадает с 02000h + 01100h
, который указывает на bar
.
изменить: исправлена логическая ошибка в коде
Ответ 2
Это просто означает адрес этого символа. Это немного похоже на оператор и на C, если вы знакомы с этим.
Ответ 3
offset
означает, что регистр si
будет равен смещению значения переменной1 (а не к его фактическому значению). Смещение - это адрес с начала сегмента памяти, в котором хранится переменная. Смещение обычно относится к сегменту ds
(в вашем случае регистры ds
и cs
указывают на один и тот же сегмент).
Ответ 4
В 16-разрядном режиме x86 адресное пространство не является плоским; вместо этого адреса состоят из смещения и "сегмента". "Сегмент" указывает на пространство 64 КБ, смещение находится в этом пространстве.
См. http://en.wikipedia.org/wiki/Memory_segmentation
Ответ 5
Смещение в основном является расстоянием от точки сегмента (также называемой точкой отсчета).
например, адрес сегмента 0000, а смещение или логический адрес - 0100, тогда физический адрес может быть подсчитан путем добавления двух пар.
Физический адрес = 0000 + 0100 = 0100
Означает, что наше требуемое место находится по адресу 0100.
Аналогично, если адрес сегмента равен 1DDD, а смещение - 0100, тогда:
Физический адрес: 1DDD + 0100 = 1EDD
Означает, что наш пункт назначения 1EDD.