Символические имена в языке ассемблера - Команда DC

Команда DC (Define Constant — Определить константу) работает так же, как и DS, но в отличие от нее позволяет производить загрузку начального значения в резервируемую область непосредственно при резервировании. Таким образом, к началу выполнения программы память, заказанная по командеDC, содержит вполне определенную информацию, тогда как никогда нельзя с уверенностью сказать, что содержит сегмент памяти после выполнения команды DS.

Предложение DC имеет формат

Имя DC КолТип'Значение'

«Кол» и «Тип» имеют тот же самый смысл, что и для команды DS. Пока для указания типа будем использовать только

F: Полное слово

D: Двойное слово

Н: Полуслово

Возможно задание и некоторых других типов, которые мы рассмотрим впоследствии.

В случае использования типов F, D или Н значением может являться любое десятичное число. Перед выполнением программы это число переводится в двоичную форму и записывается на зарезервированное место. Указание десятичных чисел в качестве «значений» является еще одним подтверждением правила: если система счисления не указана явно, все числа в программе на языке ассемблера рассматриваются как десятичные.

В результате выполнения команды DC

1. Производится резервирование «Кол» единиц памяти типа «Тип», возможно, с выравниванием границ.

2. Символическое имя, указанное в поле имени, присваивается адресу первого байта зарезервированной области.

3. «Значение» в двоичной форме заносится в эту область памяти.

Отметим, что это значение должно быть заключено в апострофы.

Рассмотрим, например, к чему приведет выполнение предложения

ONE DC 1F' 1'

Именем в данном случае является ONE, количество повторений равно 1 (так же как и в случае DS-предложения, единицу можно было опустить), тип — F, а значением является 1. Включение в программу указанного предложения приведет к резервированию выровненного полного слова, присвоению имениONE адресу первого из зарезервированных байтов и записи на выделенное место значения 00000001.

Рассмотрим другой пример,

HALF DC ЗН' — 2'

Здесь резервируется место для трех полуслов, и в каждое из них записывается — 2 в двоичной форме, т. е. FFFE. Имя HALF будет идентифицировать адрес первого байта первого полуслова.

Пусть рассмотренное предложение включено в программу следующим образом (лучше никогда не помещать команды DS и DC в середину программы, сейчас это делается исключительно в целях иллюстрации):

 

AR

5,7

 

LR

8,5

HALF

DC

3H' — 2'

 

SR

8,7


Заметим, что, так как все указанные команды имеют четную длину, условия выравнивания резервируемой области по границе полуслова автоматически выполнены в данном случае. В оттранслированном виде данный фрагмент программы будет выглядеть так:

1A571885FFFEFFFEFFFE1В87

Наконец, предположим, что мы хотим зарезервировать двойное слово, снабдив его именем DUB, и поместить в него 10010. Необходимый результат получится, если мы внесем в программу предложение

DUB DC D'100'

Использование команд, считывающих информацию из памяти или записывающих ее туда, подразумевает предварительное резервирование соответствующих областей памяти. Подобное резервирование обычно выполняется с помощью команд DS и DC. Однако тот факт, что память зарезервирована, вовсе не означает, что она не может быть использована для каких-либо иных целей. Например, с помощью команды DC можно зарезервировать одно полное слово для последующих манипуляций с ним на этапе выполнения программы. По окончании первоначально предусмотренного использования зарезервированного слова освободившееся пространство можно применять для других целей.

Куда же следует помещать предложения DC и DS?

Большая часть обрабатываемых программой данных не является машинными командами. В одном из предыдущих примеров команда DC была помещена в середину программы и был задан вопрос, как пойдет выполнение этой программы в данном случае. Ответ таков: команды AR и LR будут выполнены нормально, затем машина попытается выполнить «команду» с именем HALF. Содержимое первого полуслова (FFFE) будет рассматриваться как команда, а значит, кодом операции является FF. Операции с таким кодом не существует, поэтому выполнение программы будет прервано и будет отмечен особый случай, вызванный недействительным кодом операции. Это означает, что была произведена попытка выполнения несуществующей команды.

Таким образом, данные не должны находиться там, где они могут интерпретироваться как команды. Можно (и часто приходится) записывать данные в середину программы, но в этом случае в нее должны быть внесены и дополнительные команды перехода для предотвращения рассмотренных нежелательных последствий. На рис. 6.5 показано, как это может быть сделано.

Если нет особой необходимости делать это иначе, размещайте данные после последней реально выполняемой машинной команды в программе. Для нас это означает пока, что предложения DS и DC желательно помещать между последним предложением EOJ и предложением END программы.



 
Статьи раздела