В.Н. Пильщиков - Программирование на языке ассемблера IBM PC (1110551), страница 19
Текст из файла (страница 19)
Лля того чтобы фиксировать такие ошибки, в ЯА введены директивы условной генерации ошибок. Ках(дая из них проверяет некоторое условие и, если оно выполнено, Дополииюльиые всзмолиости 27б записывает в листинг (в ту строчку, где встретилась зта директива) сообщение о принудительной ошибке ((огссд епог).
После этого трансляпия программы будет продолжена, однако фаГш с обьектным кодоы, как и при любой иной ошибке перно" трансляпии, уже формироваться не будет. Ниже для каждой директивы условной генерапии ошибки приводятса номер ошибки и текст записываемого в листинг сообщения об ошибке. . ЕВВ1 . ЕВВ2 В7 Тогсад аггог - рава 1 Ва Рогова алгол - раве 2 99 Рогсед еггог Директива .ЕКК1 генерирует ошибку, если директива встретилась ассемблеру на его первом прохоле, директива .ЕКК2 генерирует ошибку, если она встретилась на втором проходе, а директива .ЕКК генерирует ошибку на любом прохоле. Например: ;есле имл Х ие описало и >если вто ухе 2-В проход, >то вааиксировата овибку 1РМПЕР Х .
ВВВ2 ЕМПГР . ЕВВЕ <ввракавиа> . ЕВВМЕ <вврахевие> Директива .ЕККЕ генерирует ошибку, если значение выражения равно О, а директива .ЕККЛ - если значение не равно О. Выражение должно быть константным и не содержать внешних шген и ссылок вперед. Например: .ЕВВЕ ттРЕ Ь - ВЕье;сиибка, если Ь - блввкав метка .
ЕВВМПЕР <имк> . ЕВВПЕР <имх> Директива .ЕККХОЕР генерирует ошибку, если указанное мзи еще (до директивы) не описано, а директива .ЕККОЕР - если имя уже описано. Если это имв является ссылкой вперед, то на первом проходе трансляпии оно считается неописанным, а на втором проходе - описанным. Например: .ЕВВМПЕР М ;свинка, если имв М еив ие описало у пв м пот(71 Директива .ЕККВ генерирует ошибку, если указанный текст пустой, а директива .ЕККЛ - если текст непустой. Директива .ЕККП)11 генерирует ошибку, если указанные тексты совпадают, а директива .ЕКК()1Р - если тексты различают- "ди>лапмиэи" .ЕВЕВ <текст> .Взвив <текст> .ЕВВ1ПМ <твкст1>,<такст2> .ЕВЮ)17 <текст1>,<текст2> 90 Рогова еггог - ехргевв1ов еппа1в О 91 Рогова еггог - ехргеввзов вог аппа1в О 92 тогсвд еггог - вувЬо1 вог детхвед 93 Рогова еггог - вуиЬо1 дет1аад 94 Рогова еггог - взгьав Ььаан 95 Рогсад ах*ох - аггьад аое Ьхаав 96 Рогсад еггог - еггьавв хдвагхса1 97 Рогсед еггог - вггьава дьттвгеаг Ятб Пдогрвммнроаанне на язмнв ассемблера ГВЫ РС ся.
Здесь под текстолг понимается последовательность символов, заключенная в угловые скобки. Если любая из этих директив находится в макроопределении или блоке повторений, то в текстах можно указывать формальные параметры макроса или блока (при этом допускается использование макрооператора бг), которые перед сравнением булуг заменены на соответствующие фактические параметры. Наприыер: и ивово х,х .вввв <х> ;;овабва, вели 1-й фавтвчвеаий лорамотр оауиев .Евнгпн <х>,<св> ;;овябва, если з-й фактический параметр - это св 14.6. Дополнительные директивы В данном разделе вкратце описываются директивы ЯА, которые не были рассмотрены в предыдущих часзях книги.
14.6.1. Указание типа процессора и набора команд Как уже отлгечачось, базовой сисгеыой команд процессоров фирмы 1пге1 является набор коыанд процессора 8086 (8088): любая программа, использующая только эти команды, может быть без изменений выполнена и на любом другом процессоре. В то же вреза в каждой старшей исцели имеются дополнительные команды. Наприыер, в процессоре 80186 появились новые команды Р\ЛНА, РОРА и др., а также были расширены возможности команд МШ., Р(БН, БНК и др. В процессоре 80286 допускаются все команды процессора 80186 и введено несколько новых команд, которые, правла, разрешено использовать только в привилегированном (защищенном) режиме.
В слелующих процессорах также появились новые команды. В саыих процессорах фирмы 1пге! нет команд вещественной арифметики, и операции над вещественными числами реализуются либо программным путем (для каждой операции составляется своя процедура), либо за счет подключения арифметического сопроцессора (8087, 80287 и т.
д.), который аппаратным спасобоы реализует арифметические операции над вещественными числами. В последнем случае центральный процессор обращается к сопроцессору с поыощью команды ЕЗС (см. разз. 14.2), в которой указывается, какую оперы|ию и над какими данными должен выполнить сопроцессор. При этом в ЯА для разных вариантов этой команды введены свои ынемонические обозначения, которые можно рассматривать как "команды сопроцессора". Отметим, что у сопроцессоров также соблюдается прееыственность: более старшие ыолели могут выполнять все операции более младших моделей. По умолчанию макроассемблер МАЯМ (версия 4.0) допускает использование в програыме только команд процессора 8086, применение же иных команд рассматривается как ошибка.
Если программа рассчитана на работу с другим процессором или на использование команд сопроцессора, то это надо явно указать ассемблеру, для чего используются указанные ниже директивы. Их можно поые- Дололннгольныо ооэмояносги 277 щагь в любом лгесте программы, они начинает действовать немедленно и до следующей подобной директивы. .8086 - допускается использование только команд процессора 8086 (зта директива подразумевается по умолчанию).
.186 - допускается использование всех команд процессора 8086, а также всех новых команд процессора 80186. .286С - допускается использование всех команд, поддерживаемых процессором 80286 в непривилепгрованном режиме (их набор полностью совпадает с системой командами процессора 80186). .286Р - допускается использование всех команд процессора 80286, в том числе и команд привилегированного режима.
.8087 - помимо команд основного процессора допускается и использование команд сопроцессора 8087. .287 - помимо команд основного процессора допускветсв и использование команд сопроцессора 80287. (Зюгечание: в версии 4.0 языка МАЗМ не предусмотренм анаэопггные директивы для процессора 386 и старше и для сопроцессора 387 и старше, т. к.
эта версия была разработана до их появления.) 14.6.2. Группы сепчентов 1(иректива <эмя группя> овсов <пмя оогмопта> О<яма оогмеата>1 обьединяет перечисленные сегменты в одну группу. Это значит, что все имена из всех этих сегментов булуг сегментироваться по одному и тому же сегментному регистру. По какому именно - определяется директивой АЗЯМЕ: если в ней указан операнд яг:<вмя группа> где эг - квкой-то сегментный регистр, то каждое имя из этих сегментов ассемблер будет заменять на адресную пару эг:ойь где о(з - смещение имени, отсчитанное ат начала группы (загрузку этого начала в репгстр эг должна осуществить сама программа).
Такая замена производится, даже если для какого-то из сегментов группы указан "свой" регистр. Отметим, что обьединение сегментов в группу означает их сепэентирование по одному регистру, но не их непрерывное расположение в памяти: сегменты одной группы необязательно будут размещены в памяти подрал, лгежду ними лнзгут оказаться другие сегменты (при размещении сегментов в памяти учитываются их классы, а йе их принадлежность к одной группе - см. директиву БЕОМЕХТ). Но в любом случае расстояние от начала группы до последнего занятого байта последнего сегмента группы не должно превосходзпь 64 Кб. Изи группы должно быть уникальным в программе, а сепэенты группы могут быть описаны в тексте программы квк до, так и после директивы ОйО()Р. Иьи 22В Пяопзвммилсяснис нс языке ассембяерв 1ЗМ РС группы относится к константным выражениям, его значение вычисляетса аналопзчно значению имени сепчента. Пример: зсмсЩсвас В1 отвосатслькю ак разао 0 ;смащавиа А отвоситальао В1 равао 0 ;ев ак ;слааиаловтво НОЧ ПВ,ЕВ:О ;эилииалсвтао ИОЧ СХ,ЕВ:20А Отметим непоследовательность ЯА при работе с группами.
Если во всех командах имена из сепчентов группы заменяются на сьгещения имен, отсчитанные от начала группы, то значением оператора ОРРБЕТ 11 является смещение имени Х относительно сегмента, в котором оно описано, даже если этот сегмент входит в группу (тюг, в приведенном примере значение ОРРЗЕТ В будет равно О). Чтобы смещение имени Х в этом операторе отсчитывалось от начала группы, надо вместо Х записать хонструкцию <иьы группы>:Х (в нашем примере значение оператора ОРРЗЕТ ОКВ равно 20Ь).
Аналопсчная проблема вознихает при описании адресных констант в директивах Р% и РР: если в качестве их операнда указать просто иьи, то оно будет заменено ассемблером на смещение имени, отсчитанное ог начала того сегмента, где имя описано, а не от начала группы, в которую входит данный сегмент. Здесь также, если нужен отсчет смещения от начала группы, следует применить конструкпию вида <имя группы>:<имя>. 14.6З. Изменение счетчика размещения Транслируя программу, ассеыблер следит за адресом ее очередного предложения, который он хранит в счетчике размещения и значение которого ыожно узнать в программе с помощью символа 3. Следующие две директивы позволяют менять значение этого счетчика.
Эта директива выравнивает счетчик размещения на ближайший четный адрес: если текущее значение счетчика четно, то оно не меняется, а иначе в очередной байт памяти ассемблер записывает величину 90Ь (команда 1>ОР) и увеличивает значение счетчика на 1. аи аковр В1,82 в1 веаиен* А ПВ 20А ВВР(01 В1 ЩФВ вг веаикит В ВВ 1 вэ инва сове вкаиеит АВИОНЕ СВ:СОВЕ, иоч Ах,ак иоч еа,ьх ИОЧ ВН,А моч сх,в зсмощсиис В2 отаосатсльао ак раино 20А ;смащаава В отвосатсиьво В2 раино 0 Долслннтвльнмв всвмоиносги 220 одо <вмрвкевве> Выражение может быль константным или адресным, но все используемые в неы имена должнм быть из текущего сегмента, причем они должнм быть описаны до этой директивы.