Для присвоения некоторому постоянному выражению символического имени (идентификатора) используется директива EQU или оператор «=», формат которых приведен на рис.5.8. В качестве выражения могут быть использованы константы, имена меток, имена и строки в кавычках.
Рис. 5.8. Директивы задания констант
С помощью директивы EQU идентификатору можно ставить в соответствие как числовые выражения (константы, формулы), так и текстовые строки, а оператор равенства может использоваться только с числовыми выражениями. Константы, определенные с помощью оператора «=», можно переопределять в исходном тексте программы, а определенные с использованием директивы EQU нельзя.
Директиву EQU удобно использовать для настройки программы на конкретные условия выполнения и легкого изменения этих условий, замены сложных в обозначении объектов, многократно используемых в программе, более простыми именами и т. п.
В данном примере директивой fielda будет зарезервировано десять байт, значение которых не определено:
times EQU 10
…
fielda DB TIMES DUP (?)
В регистр СХ будет занесено значение 1EH:
countr EQU 1EH
...
MOV CX,countr
Директивой EQU можно задавать и символьные строки, например,
pre EQU 'PC'
C помощью директивы можно переименовать регистр:
akk EQU AX
MOV akk,25
Оператор «=» удобно использовать для определения простых абсолютных (то есть не зависящих от места загрузки программы в память) математических выражений. Причем в его выражениях можно использовать метки и ссылки на адреса – главное, чтобы в итоге получилось абсолютное выражение:
per1 DB 12, 7, 41
per2 DB 43, 5, 12, 'P', 21, 110
len = 43
len = len+1;можно и через предыдущее определение
len2 = per2 – per1;длина массива (три)
Вопросы для самопроверки
1. Определите символьную строку по имени tit, содержащую константу «Hello, world»?
2. Определите следующие значения в элементах данных с именами от fld1 до fld5:
2.1. двухбайтовый элемент, содержащий неопределенное значение;
2.2. однобайтовый элемент, содержащий шестнадцатеричный эквивалент десятичного числа 41;
2.3. однобайтовый элемент, содержащий шестнадцатеричный эквивалент десятичного числа –12;
2.4. массив четырехбайтовых элементов, содержащий последовательные значения: 16, 19, 20, 27, 30;
2.5. символьную строку 'Hello'.
3. Сколько байт в памяти будет зарезервировано в памяти следующей директивой:
per1 DB 20 DUP(30 DUP(5))
4. Имеется массив ARRAY DW 4, 41, 3H, 55H, 101B. Записать в регистр в AX третий элемент массива, а в регистр BX – пятый элемент массива.
5. Написать директиву привязки всех сегментных регистров к сегменту кода по имени text.
6. Написать две директивы описывающие сегмент стека по имени text.
7. В программе имеются три директивы:
per1 DB 5, 12, 1, 'А', 'ab'
per2 DB 3, 75, 11
per3 = per2 – per1
Чему равно значение директивы per3 в данном случае?
8. Сколько байт памяти зарезервирует следующая директива?
fld DB 'А и Б сидели на трубе'