Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 28

Unknown Author

Операторы одного старшинства вычисляются слева направо. Например, А+В-С - это (А+В)-С.

2.5.1. Константные выражения

Значениями константных выражений всегда являются 16-битовые целые числа (единственным исключением является директива DD, в которой можно явно указывать 32-битовые числа). При этом, если значением (в математическом смысле) константного выражения является отрицательное число, то в формируемую машинную программу оно записывается в дополнительном коде.

К простейшим константным выражениям относятся:

•    число от -215 до 216-1 (числа вне этого диапазона рассматриваются как ошибка);

•    символ (значением такого выражения является код символа; например, значением выражения '0' будет число 30h);

•    строка из двух символов (значением является число-слово, составленное из кодов этих символов; например, значением выражения ЮГ будет число

303 lh);

•    имя константы (значением такого выражения является значение константы; например, если была директива К EQU 10, то значение К равно 10).

Другие простейшие константные выражения будут рассмотрены позже.

Среди константных операторов, т. е. операторов с числовым значением,. пока отметим уже известный нам оператор TYPE и следующие арифметические операторы (k, к1 и к2 означают любые константные выражения):

•    одноместные плюс и минус: +к, -к

•    операторы сложения и вычитания: kl+k2, к1-к2

•    операторы умножения и деления: kl *к2, kl/k2, kl MOD к2

(* - умножение, / - деление нацело, MOD - взятие остатка от деления)

Пример использования константного выражения с арифметическими операторами:

к EQU 30

X DB (3*К-1)/2 DUP(?) ;массив из 44 байтов

Операндами арифметических операторов должны быть константные выражения. Но здесь есть одно важное исключение: в Я А разрешается вычитание одного адреса из другого и в результате получается число, а не адрес.

Пример:

X DW 1,2,3,4,5 У DB ?

SIZE_X EQU У-Х ; SIZE_X =10

Вычитание адресов используется обычно для определения расстояния (числа байтов) между этими адресами. В нашем случае разность Y-X показывает, сколько байтов занято всеми элементами массива X.

Отметим одну особенность арифметических операторов: все они выполняются в области 16-битовых чисел, т. е. от результата всегда берутся только последние 16 битов (остаток от деления на 216, на 10000h), например:

(2*9000h)/lQ0h = (12000h)/100h -> 2000h/100h = 20h (а не 120h)

2.5.2. Адресные выражения

Значениями адресных выражений являются 16-битовые адреса. Все операции над адресами выполняются по модулю 216 (10000h).

К простейшим адресным выражениям относятся:

•    метка (имя команды) и имя переменной, описанное в директиве DB, DW или DD (значениями таких выражений являются адреса меток и имен);

•    счетчик размещения; он записывается как $ и обозначает адрес того предложения, в котором он встретился. При трансляции программы ассемблер следит за тем, в ячейку с каким адресом должен попасть машинный эквивалент очередного предложения программы на ЯА; так вот, если мы хотим сослаться на этот адрес, то и надо указать $. Отсюда следует, что в разных предложениях $ обозначает разные адреса. Например, если адрес переменной А равен 100h, то имеем