Переопределение сегментной части адресного выражения
Адресные выражения имеют значения, состоящие из сегмента и смещения. Вы можете задавать сегмент явно в виде сегментного регистра. (Если вы задаете его, как значение группы, Турбо Ассемблер определяет, какой сегментный регистр нужно использовать, на основе предполагаемых значение сегментных регистров (ASSUME)). Для изменения сегментной части адресного выражения используется следующий синтаксис:
выражение_1 : выражение_2
Данная операция возвращает адресное выражение, использующее в качестве смещения выражение_2, а в качестве сегмента или значения группы - выражение_1. Например:
VarPtr dd dgroup:memvar ; dgrout - это группа mov cl,es[si+4] ; переопределение сегмента ES
Получение сегмента и смещения адресного выражения
Для получения сегмента и смещения адресного выражения вы можете использовать операции SEG и OFFSET. Операция SEG возвращаетсегментную часть адресного выражения. Она имеет следующий синтаксис:
SEG выражение
Приведем пример исходного кода:
DATASEG temp DW 0 CODESEG mov ax,SEG temp mov ds,ax ASSUME ds:SEG temp
Операция OFFSET возвращает смещение адресного выражения и имеет следующий синтаксис:
OFFSET выражение
Заметим, что когда вы используете операцию смещения, убедитесь, что выражение ссылается на корректный сегмент. Например, если вы используете режим MASM и не используете упрощенные директивы, выражение:
OFFSET BUFFER ; буфер - это адрес в памяти
что не тоже самое, что:
OFFSET DGROUP:BUFFER ; Dgroup - это группа, содержащая сегмент, который содержит BUFFER
(если содержащий BUFFER сегмент не является первым сегментом группы).
Если вы не переопределяете сегмент с помощью операции :, в режиме Ideal адреса автоматически вычисляются относительно любой группы, которой принадлежит сегмент. В режиме MASM это имеет место при использовании упрощенных сегментных директив. В противном случае адреса вычисляются относительно сегмента, в котором находится объект, а не какой-либо группы.
Создание адресного выражения, использующего счетчик инструкций
Для создание адресного выражения, которое указывает на текущий сегмент и счетчик инструкций, можно использовать операцию THIS. В режиме Ideal можно использовать следующий синтаксис:
THIS тип
Синтаксис режима Ideal позволяет вам строить адресное выражение на основе текущего сегмента и счетчика инструкций для заданного типа.
В режиме MASM используется следующий синтаксис:
THIS выражение
Синтаксис режима MASM работает аналогично режиму Ideal, но для определения типа использует числовое значение выражения. Это следующие значения: 0=UNKNOWN, 1=BYTE, 2=WORD, 4=DWORD, 6=PWORD, 8=QQORD, 10=TBYTE, 0ffffh=NEAR, 0fffeh. Например:
ptr1 LABEL WORD ptr2 EQU THIS WORD ; аналогично ptr1
Определение характеристик выражения
Иногда (например, в макрокоманде) бывает полезно определить характеристики заданного выражения. Для этого служат операции SYMTYPE и .TYPE.
В режиме Ideal используется следующий синтаксис:
SYMTYPE выражение
В режиме MASM используется следующий синтаксис:
.TYPE выражение
Операции SYMTYPE и .TYPE возвращают описывающее выражение значение-константу. Это значение разбивается на битовые поля, показанные в следующей таблице:
Битовые поля операций SYMTYPE и .TYPE Бит | Значение |
---|
0 | Выражение является относительным указателем памяти в программе. | 1 | Выражение является относительным указателем на данные в программе. | 2 | Выражение представляет собой значение-константу. | 3 | Выражение использует прямой режим адресации. | 4 | Выражение содержит регистр. | 5 | Идентификатор определен. | 7 | Выражение содержит идентификатор, определенный извне. |
Если биты 2 и 3 равны нулю, то выражение содержит косвенный регистр ([BX]).
Если Турбо Ассемблер не может вычислить выражение, то операция SYMTYPE возвращает соответствующие ошибки. Однако операция .TYPE в этих случаях будет возвращать значение (обычно 0).
1 2 3 4 5 6 7
8 8 8
| |