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

Unknown Author

Во-вторых, появление имени в начале команды или директивы считается описанием данного имени. В ЯА действует общее правило: каждое имя должно быть описано только раз, т. е. в программе не должно быть двух предложений с одним и тем же именем вначале. (Из этого правила есть исключения, они будут оговариваться явно.)

В-третьих, если в языках высокого уровня действует правило "сначала опиши и лишь затем используй", то в Я А такого правила нет и именем можно пользоваться (ссылаться на него) как до его описания, так и после описания. Поэтому допустимы оба следующих случая:

ссылка назад

ссылка вперед

Чтобы различать эти случаи, вводят термины "ссылка назад" и "ссылка вперед". Ссылка назад (см. слева) - это ссылка на имя, которое по тексту программы описано раньше, а ссылка вперед (см. справа) - это ссылка на имя, которое будет описано позже.

При трансляции ассемблер просматривает текст программы на ЯА сверху вниз. Когда он встречает ссылку на имя, которое уже было описано, то он, имея к этому моменту всю информацию об имени, может правильно оттранслировать данную ссылку. Но если ему встретилась ссылка вперед, т. е. имя, которое еще не описано и о котором он пока ничего не знает, то он не всегда может правильно оттранслировать эту ссылку и потому здесь нередко возникают проблемы. В связи с этим, хотя в целом Я А и допускает ссылки вперед, в некоторых случаях такие ссылки запрещаются (эти случаи будут оговариваться явно), поэтому лучше всего стараться не использовать ссылки вперед.

23. Директивы определения данных

Для описания переменных, с которыми работает программа, в ЯА используются директивы определения данных. Одна из них предназначена для описания данных размером в байт, вторая - для описания данных размером в слово, а третья - для описания данных размером в двойное слово. В остальном эти директивы практически не отличаются друг от друга.

23.1. Директива DB

По директиве DB (define byte, определить байт) определяются данные размером в байт. Ее синтаксис (без учета возможного комментария в конце) таков:

[<имя>] DB <операнд> {,<операнд>>

Встречая такую директиву, ассемблер вычисляет операнды и записывает их значения в последовательные байты памяти. Первому из этих байтов дается указанное имя, по которому на этот байт можно ссылаться из других мест программы.

Существует два основных способа задания операндов директивы DB:

•    ? (знак неопределенного значения),

•    константное выражение со значением от -128 до 255.

Остальные способы задания операндов производны от этих двух.

Операнд ?

Возможный пример:

X DB ?

По этой директиве описывается переменная X. Для нее отводится один байт памяти, в который ничего не записывается (в этом байте будет то, что осталось от предыдущей программы, и предугадать, что там находится, нельзя). В этом случае говорят, что переменная не получает начального значения.

Где отводится этот байт? Транслируя программу, ассемблер просматривает предложение за предложением и размещает соответствующие им машинные представления в последовательных ячейках памяти. Поэтому, встречая директиву DB, он отводит под указанную переменную первый из еще не занятых байтов памяти. Это следует учитывать и, например, не надо вставлять директиву DB между командами.