Читать «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, то имеем