Директивы задания констант

Для присвоения некоторому постоянному выражению символического имени (идентификатора) используется директива 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 'А и Б сидели на трубе'