Ссылки на структуры, объединения и смещения элементов в таблице
Элементы структур, объединений и таблиц являются глобальными переменными, значения которых представляют собой в режиме MASM смещения в структуре, объединении или таблице. Однако в режиме Ideal элементы этих типов данных рассматриваются, как локальные по отношению к типам данных. Операция точки (.) позволяет вам получить смещения элементов. В режиме Ideal используется следующий синтаксис:
выражение.идентификатор
где "выражение" представляет адрес структуры, объединения или экземпляра таблицы. "Идентификатор" должен быть элементом структуры, объединения или таблицы. Операция точки возвращает смещение элемента в структуре.
В режиме MASM также имеется версия операции точки. Однако ее функция аналогична операции + и имеет следующий синтаксис:
выражение_1 + выражение_2
Описание содержимого адреса
Многие инструкции позволяют вам различать адрес и содержимое адреса. Вы можете делать это, используя квадратные скобки. Например:
MOV AX,BX ; переместить BX в AX MOV AX,[BX] ; переместить в AX содержимое по адресу BX
Приведем общий синтаксис, в котором используются квадратные скобки:
[выражение]
В режиме MASM квадратные скобки для выражений, являющихся адресами, не обязательны. В качестве операнда инструкции процессоров 80х86 не может использоваться полный адрес. Вместо этого используется только сегмент (полученный с помощью операции SEG) или смещение (полученное с помощью операции OFFSET).
Если ясно, что выражение является адресом, а квадратные скобки не используются, то в режиме Ideal выводится предупреждающее сообщение. Это предупреждение можно запретить (см. этот раздел). Однако хорошей практикой программирования является использование скобок.
Подразумеваемое сложение
В режиме MASM сложение выражений можно выполнять несколькими способами: с помощью операции сложения (+), с помощью операции точки (.), или с помощью подразумеваемого (неявного) сложения (когда выражения разделяются квадратными и круглыми скобками). Например:
MOV AX,5[BX] ; содержимое по адресу BX+5 MOV AX,5[XYZ] ; содержимое по адресу XYZ+5
Неявная операция сложения имеет следующий общий синтаксис:
выражение_1 [выражение_2] или выражение_1 (выражение_2)
Получение значения старшего или младшего байта выражения
Для возврата значения старшего или младшего байта выражения можно использовать операции HIGH и LOW. Это обстоятельство может быть полезно, например, в ситуации, когда требуются только старшие 8 бит смещения адреса.
Приведем пример операций HIGH и LOW:
HIGH выражение LOW выражение
Например:
magic equ 1234h mov cl,HIGH magic ; cl = 12h mov cl,LOW magic ; cl = 34h
Задание 16- или 32-разрядных выражений
Если текущим выбранным процессором является процессор 80386 или старше, то Турбо Ассемблер предоставляет две операции, которые определяют, будет выражение интерпретироваться как 16- или 32-разрядное значение. Это операции SMALL и LARGE. Они имеют следующий синтаксис:
SMALL выражение LARGE выражение
Операция SMALL помечает выражение, как представляющее 16-разрядное значение. Операция LARGE помечает его как 32-разрядное значение. Эти операции особенно важны в программах, при работе которой в операционной среде некоторые сегменты являются 32-битовыми, а другие - 16-битовыми. Например, инструкция:
JMP [DWORD PTR ABC]
представляет собой косвенный переход на содержимое переменной в памяти ABC. Если у вас разрешено использование процессора 80386, то данная инструкция может интерпретироваться либо как дальний переход с использованием сегмента и 16-разрядного смещения, либо как ближний переход по 32-разрядному смещению. Для устранения неоднозначности вы можете использовать операции LARGE и SMALL:
JMP SMALL [DWORD PTR ABC]
Данная инструкция приводит к ассемблированию Турбо Ассемблером инструкции перехода таким образом, что значение, считываемое из ABC, интерпретируется как 16-разрядный сегмент и 16-разрядное смещение. При этом Турбо Ассемблер выполняет косвенный переход типа FAR (дальний переход).
При использовании операций SMALL или LARGE в адресной части смещения, эти операции указывают, что адрес является 32-разрядным, например:
JMP SMALL [LARGE DWORD PTR ABC]
указывает, что переменную в памяти ABC описывает 32-разрядный адрес, но ее содержимое интерпретируется как 16-разрядный сегмент и 16-разрядное смещение. 1 2 3 4 5 6 7
8 8 8
| |