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

Unknown Author

Например:

IFNDEF X    ;если имя X ве описано и

.ERR2    ;если это уже 2-й проход,

ENDIF    ;то зафиксировать ошибку

.ERRE <выражение>    90 Forced error - expression equals 0

.ERRNZ <выражевие>    91 Forced error - expression not equals 0

Директива .ERRE генерирует ошибку, если значение выражения равно 0, а директива .ERRNZ - если значение не равно 0. Выражение должно быть константным и не содержать внешних имен и ссылок вперед. Например:

.ERRE TYPE L - NEAR ;ошибка, если L - близкая метка

.ERRNDEF <имя>    92 Forced error - symbol not defined

.ERRDEF <имя>    93 Forced error - symbol defined

Директива .ERRNDEF генерирует ошибку, если указанное имя еще (до директивы) не описано, а директива .ERRDEF - если имя уже описано. Если это имя является ссылкой вперед, то на первом проходе трансляции оно считается неописанным, а на втором проходе - описанным. Например:

.ERRNDEF N    ;ошибка, если имя N еще ве описаво

Y DB N DUP(?)

.ERRB <текст>

.ERRNB <текст>

.ERRIDN <текст1>,<текст2> .ERRDIF <текст1>,<текст2>

94    Forced error - string blank

95    Forced error - string not blank

96    Forced error - strings identical

97    Forced error - strings different

Директива .ERRB генерирует ошибку, если указанный текст пустой, а директива .ERRNB - если текст непустой. Директива .ERRIDN генерирует ошибку, если указанные тексты совпадают, а директива .ERRDIF - если тексты различаются. Здесь под текстом понимается последовательность символов, заключенная в угловые скобки. Если любая из этих директив находится в макроопределении или блоке повторений, то в текстах можно указывать формальные параметры макроса или блока (при этом допускается использование макрооператора &), которые перед сравнением будут заменены на соответствующие фактические параметры. Например:

м macro х,Y

;;ошибка, если 1-й фактический параметр опущен ;;ошибка, если 2-й фактический параметр - это CS

.ERRB <Х>

.ERRIDN <Y>,<CS>

ENDM

14.6. Дополнительные директивы

В данном разделе вкратце описываются директивы ЯА, которые не были рассмотрены в предыдущих частях книги.

14.6.1. Указание типа процессора и набора команд

Как уже отмечалось, базовой системой команд процессоров фирмы Intel является набор команд процессора 8086 (8088): любая программа, использующая только эти команды, может быть без изменений выполнена и на любом другом процессоре. В то же время в каждой старшей модели имеются дополнительные команды. Например, в процессоре 80186 появились новые команды PUSHA, РОРА и др., а также были расширены возможности команд MUL, PUSH, SHR и др. В процессоре 80286 допускаются все команды процессора 80186 и введено несколько новых команд, которые, правда, разрешено использовать только в привилегированном (защищенном) режиме. В следующих процессорах также появились новые команды.

В самих процессорах фирмы Intel нет команд вещественной арифметики, и операции над вещественными числами реализуются либо программным путем (для каждой операции составляется своя процедура), либо за счет подключения арифметического сопроцессора (8087, 80287 и т. д.), который аппаратным способом реализует арифметические операции над вещественными числами. В последнем случае центральный процессор обращается к сопроцессору с помощью команды ESC (см. разд. 14.2), в которой указывается, какую операцию и над какими данными должен выполнить сопроцессор. При этом в ЯА для разных вариантов этой команды введены свои мнемонические обозначения, которые можно рассматривать как ’’команды сопроцессора". Отметим, что у сопроцессоров также соблюдается преемственность: более старшие модели могут выполнять все операции более младших моделей.