Что означает OFFSET в 16-битном ассемблерном коде?

Я рассмотрю примерный код сборки для 16-битного реального режима.

Я натолкнулся на строки:

    mov bx, cs
    mov    ds, bx
    mov    si, OFFSET value1
    pop    es
    mov     di, OFFSET value2

что это делает? Что делает "СМЕЩЕНИЕ"?

Извините, если это очень простой вопрос, я новичок в этом.

12
задан Without Me It Just Aweso 03 нояб. '09 в 22:36
источник поделиться

5 ответов

Как утверждают некоторые другие ответы, ключевое слово 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.

изменить: исправлена ​​логическая ошибка в коде

14
ответ дан Nathan Fellman 03 нояб. '09 в 23:02
источник поделиться

Это просто означает адрес этого символа. Это немного похоже на оператор и на C, если вы знакомы с этим.

6
ответ дан copumpkin 03 нояб. '09 в 22:38
источник поделиться

offset означает, что регистр si будет равен смещению значения переменной1 (а не к его фактическому значению). Смещение - это адрес с начала сегмента памяти, в котором хранится переменная. Смещение обычно относится к сегменту ds (в вашем случае регистры ds и cs указывают на один и тот же сегмент).

3
ответ дан Alexey Kalmykov 03 нояб. '09 в 22:43
источник поделиться

В 16-разрядном режиме x86 адресное пространство не является плоским; вместо этого адреса состоят из смещения и "сегмента". "Сегмент" указывает на пространство 64 КБ, смещение находится в этом пространстве.

См. http://en.wikipedia.org/wiki/Memory_segmentation

1
ответ дан Erich Kitzmueller 03 нояб. '09 в 22:40
источник поделиться

Смещение в основном является расстоянием от точки сегмента (также называемой точкой отсчета). например, адрес сегмента 0000, а смещение или логический адрес - 0100, тогда физический адрес может быть подсчитан путем добавления двух пар. Физический адрес = 0000 + 0100 = 0100 Означает, что наше требуемое место находится по адресу 0100. Аналогично, если адрес сегмента равен 1DDD, а смещение - 0100, тогда: Физический адрес: 1DDD + 0100 = 1EDD

Означает, что наш пункт назначения 1EDD.

1
ответ дан user2961595 06 нояб. '13 в 20:30
источник поделиться

Другие вопросы по меткам