Условная генерация пользовательской ошибки

Безусловная генерация пользовательской ошибки

Директивы генерации ошибок

Вложенность директив условной трансляции

Как мы неоднократно видели в приведенных выше примерах, 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)


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