Условная генерация пользовательской ошибки
Безусловная генерация пользовательской ошибки
Директивы генерации ошибок
Вложенность директив условной трансляции
Как мы неоднократно видели в приведенных выше примерах, TASM допускает вложенность условных директив компиляции. Более того, так как вложенность требуется довольно часто, TASM предоставляет набор дополнительных директив формата ELSEIFxxx, которые заменяют последовательность подряд идущих ELSE и IFxxx в структуре:
IFxxx; ELSE IFxxx;...ENDIFENDIF |
Эту последовательность условных директив можно заменить эквивалентной последовательностью дополнительных директив:
IFxxx;... ELSEIFxxx;...ENDIF |
Наличие xxx в ELSExxx говорит о том, что каждая из директив IF, IFB, IFIDN и т. д. имеет аналогичную директиву ELSEIF, ELSEIFB, ELSEIFIDN и т. д.
В конечном итоге это улучшает читаемость кода. В последнем примере фрагмента макроса, проверяющем, имя какого регистра было передано в макрос, наблюдается подобная ситуация. Последовательность ELSE и IFDIFI можно записать так, как в строке 4:
<1>show macro rg<2>ifdifi ,<3>goto M_al<4>elseifdifi ,<5> goto M_ah<6>else<7>exitm<8>endif<9>:M_al<10>...<11>:M_ah<12>...<13>endm |
В языке TASM есть ряд директив, называемых директивами генерации пользовательской ошибки. Их можно рассматривать и как самостоятельное средство, и как метод, расширяющий возможности директив условной компиляции. Они предназначены для обнаружения различных ошибок в программе, таких как неопределенные метки или пропуск параметров макроса.
Директивы генерации пользовательской ошибки по принципу работы можно разделить на два типа:
- безусловные директивы, генерирующие ошибку трансляции без проверки каких-либо условий;
- условные директивы, генерирующие ошибку трансляции после проверки определенных условий.
Большинство директив генерации ошибок имеют два обозначения, хотя принцип их работы одинаков. Второе название отражает их сходство с директивами условной компиляции. При дальнейшем обсуждении такие парные директивы будут приводиться в скобках.
К безусловным директивам генерации пользовательской ошибки относится только одна директива — это ERR (.ERR).
Данная директива, будучи вставлена в текст программы, безусловно приводит к генерации ошибки на этапе трансляции и удалению объектного модуля. Она очень эффективна при ее использовании с директивами условной компиляции или в теле макрокоманды с целью отладки.
Набор условий, на которые реагируют директивы условной генерации пользовательской ошибки, такой же, как и у директив условной компиляции. Поэтому и количество этих директив такое же. К их числу относятся следующие директивы:
.ERRB (ERRIFB) и .ERRNB (ERRIFNB)
.ERRDEF (ERRIFDEF) и .ERRNDEF (ERRIFNDEF)
.ERRDIF (ERRIFDIF) и .ERRIDN (ERRIFIDN)
.ERRE (ERRIFE) и .ERRNZ (ERRIF)
Принцип их работы ясен, поэтому рассматривать их мы будем очень кратко. Заметим только, что как и директивы условной компиляции, использовать большинство директив условной генерации пользовательской ошибки можно как в макроопределениях, так и в любом месте программы.