В.Н. Пильщиков - Программирование на языке ассемблера IBM PC (1110551), страница 18
Текст из файла (страница 18)
Нулевое значение оператора означает, что иьи никак не описано в программе либо является названием команды, директивы или оператора, либо валяется именем, которому по директиве Щ() поставлено в соответствие нсчисловое значение. Оператор .ТУРЕ обычно используется в ыакроопределениях для проверки имен, заданных как фактические параметры. Доналнитвньныв воэможности 271 14.4. Директивы управления листингом При трансляции программы ассемблер формирует ее листинг, в котором помимо текста на ЯА указываются сгенерированный машинный код, диаптостические сообщения об ошибках, таблица имен с их атрибутами и т. д. Перечисленные ниже директивы влияют на формирование листинга - определяют размер его страниц, указывают, что включать в листинг, а что не включать, и т.
п. 21тье <толст> Под текстом (уголки не нужны) здесь понимается последовательносп любых си>аюпов, начиная с первого символа, отличного от пробела, и до конца строки (если текст большой, от него берутся первые 00 символов). Этот текст становится заголовком, который будет появляться в первой строке каждой страницы листинга. Директива может быть расположена в люболт месте программы. Допустиыа только одна директива Т1Т1 Е, появление второй директивы вызовет ошибку.
Если директивы нет, начальные строки страниц листинга будут пустыми. ВОВРРЬ <теаст> Укаэанный текст (см. директиву ТГП.Е) становится подзаголовком, который будет появляться во второй строке каждой страницы листинга, начиная с очередной страницы. Если лирекпшы нет, вторая строка страниц остается пустой. В программе может быть любое число директив ЯЗВТП..
(Эта директива может указываться без директивы Т(Т(.Е.) РАЯе (<лалла>1 [,<лнрлла>1 РА0Е + РА0Е Параметр "длина" - зто целое число от 10 до 255 (по умолчанию берется 50), а "ширина" - целое число от 00 до 132 (по умолчанию - 80). Первый вариант атой директивы устанавливает размер страниц листинга- число строк на странице (длину страницы) и число позиций в каждой строке (ширину). Этот размер устанавливается начиная со страницы, на которой находится директива. Если какой-то из параметров отсуктвует, то соответствующий Рзэмер страницы не меняется. Примеры: 1100 строк по 60 позиций в кааяой ;00 полиций л строже (число строл ле мелаетсл) РАЯЕ 100,60 Рхав ,ао "ДИАПОПМИФИ" На каждой странице (в прююй части ее первой строки) листинга указывается ее номер в визе Я-Р, где Я - номер секции, а Р - номер страницы в секции.
Начазьныйт ноыер равен 1-1. Номер страницы автоьитически увеличивается на 1 при переходе на новую страницу, номер же секции не меняется автоматически. Второй ва(еынг директивы (РАСЕ +) означает переход к новой секции и новой странице листише, при агом номер секции увеличивается на 1, а номер страницы становится равным 1. (Что считать секцией, когда менять номер секции - решает автор программы.) 272 Программирование яа язьия ассвмбяора 1ВМ РС Третий вариант директивы означает "насильственный" переход на новую страницу листинга с увеличением ноыера страницы на 1 и без изменения номера секции. .хьгвт По директиве прекращается формирование листинга (сама директива в него не попадает): все последующие строки программы не появятся в листинге. .ывт Директива отменяет действие директивы .ХЫЗТ, т.
е. восстанавливает формирование листинга (начиная с нее самой). Директива ЫЗТ подразумевается по умолчанию в начале программы. Пример: После ягой директивы в листинг не будут записываться макрорасширения и копии блоков повторений (в листинг попалуг только макрокомандм и исходные тексты блоков). После втой директивы в листинг будут записываться макрорасширения и копии блоков повторений, однако в них будут указываться только те прелложения, по которым асселгблер генерирует колшндм и данные (предложения-комментарии и некоторые директивы типа АЗЗ()МЕ или ЕЯ() не попадуг в листинг).
Этот режим устанавливается по умолчанию в начале программы. Директива отменяет лействие лиректив .ЗА1,Ь и .ХАЬЬ, после нее в листинг будут записываться все предяожения всех ывкрорасширений и всех копий блоков повторений. Директива подаюшет запись в листинг предложений тех ветвей 1Р-блоков, которые соответствуют ложным условиям. Зтот режим устанавливается по умолчанию в начале программы. .ьтсонп Директива отменяет действие директивы .ЗРСО)ЧТЗ, т. е. восстанавливает запись в листинг всех ветвей 1Р-блоков. .хыят гисглвв ьгвтв.ьвм .ывт ;воя превпопввпл включаемого файла ;ывтв.авм по заппопваптеп в ппотппг доооииигеиьиме еозмомиооги эта 14.5. Директивы контроля за работой ассемблера Здесь бегло рассматриваются директивы ЯА, позволяющие в той или иной мере контролировать процесс трансляции программы.
145.1. Директива %О1)Т Встречая при трансляции программы директиву аоот <ееаое> ассемблер неыелленно выдает на экран с новой его строчки указанный текст (последовательносп, любых символов до конца строки). Если директива находится внутри макроопределения или блока повторения, то в ее тексте можно указывать формальные параметры макроса нли блока (с уточнением, если надо, их грашщ ыакрооператором ос), которые перед печатью будут заменены на фыггические параметры. В машинную программу директива %О1)Т не попадает. Такие печати полезны для отслеживания процесса трансляции программы.
Например, если имеется макроопределение хх масло х аоот оорэиеееег вх х клс х внви то, скажем, по макрокоманде ЕХ 31 будет сформировано макрорасширение аоот овраиеееег кх аг пгс ах по которому ассеьгблер выдаст на экран текст "Обращение: ЕХ 3Г, а в машин- ную програьшу запишет команэу ЕчС 31. 14.52. Дополнительные 1г -даректзгвы Недостатком директивы %О()Т является то, что она "срабатывает" дважды, поскольку ассемблер два раза пргкматривает текст транслируемой программы. Последнее обстоятельство обусловлено трудносщми, которые испытывает ассемблер при трансляции ссылоь: вперед. Дело в том, что если ассемблер, просматривающий текст программы от начала к концу, встретит имя, которое еще не было описано, то он не будет знать, что обозначает зто имя, каковы тип и адрес ячейки, помеченной этим именем, и потому не булет знать, как транслировать предложение, в котором встретилось это шы.
Чтобы решип проблеыу со ссылками вперед, ассеыблер осущестюыет, как говорят, два прохода - он дважды полностью просматривает текст программы. На первом проходе он собирает информацию (типы, адреса и т. и.) обо всех именах, описанных в программе (в том числе и об именах, которые используются в программе до их описаньи), а на втором проходе, пользуясь этой информацией, уже переводит программу на машинный язык. "диалог-миеи" 278 Программнреванне на немев ассемблера (Ем РС Вообще говоря, можно и не знать об этих двух прохолах ассемблера, олнако иногда это знание полезно и даже необходимо. Например, если по директиве %О])Т нужно только один раз выдать текст на экран (только на первом или только на втором прохоле), тогда следует воспользоваться следующими 1р-директивами условного ассеыблирования: 121 1Р2 Условие директивы 1Г1 считается выполненным, когда ассемблер совершает свой первый проход (просыагривает текст программы в первый раз), и невыполненным при втором проходе.
И наоборот, условие директивы 1РВ считается выполненным на втором проходе и невыполненным на первом проходе. Следующие две директивы также относятся к 1Р-дирехтивюг: 1РОЕР <нмв> 1РМОЕР <нма> На первом проходе трансляции условие директивы 1Р)ЭЕР (11 дейлеб, если определено) считается выполненным, если указанное имя уже описано (до этой директивы) в программе, и считается невыполненным, если это иьш будет описано позже или вообще не описано в программе. На втором проходе условие директивы считается выполненным, если юш вообще описано в программе (до или после этой директивы).
В директиве же 1рХОЕГ (1( пог дейлеб) условие считается выполненным, если имя не было описано до этой директивы (для первого прохода) или если имя вообще не описано в программе (для второго прохода). Описанными считаются имена, указанные в левой части команд и директив, а также имена полей структур и записей, иыена регистров. Названия же команд, директив и операторов не относятся к описанныы именаь(.
Пример. По 1Е-блоку 1РОЕР М 8 Ов и ООР(т) ехае 8 ОВ 256 ООР(2] ЕМО1Р в окончательньш текст программы попалет описание 3 как массива из Х байтов, если в программе описано иьы Х, а иначе - кюс 25б-баГпового массива. 14.ЕЗ. Условная генерация ошибок При трансляции программы может возникнуть ситуация (например, в ыакрокоманле не указан обязательный параметр), когда с точки зрения правил языка в программе все в порядке, но вот с точки зрения логики програымы возникла ошибочная ситуация, которую может установить только автор программы.