Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Директивы IFIDN, IFIDNI, IFDIF и IFDIFI




       Директивы IFIDN, IFIDNI, IFDIF и IFDIFI позволяют не просто проверить наличие или значения аргументов макрокоманды, но и выполнить идентификацию аргументов как строк символов. Синтаксис этих директив:

IFIDN(I) аргумент_1, аргумент_2

       фрагмент_программы_1

ELSE

       фрагмент_программы_2

ENDIF

 

IFDIF(I)    аргумент_1, аргумент_2

       фрагмент_программы_1

ELSE

       фрагмент_программы_2

ENDIF

 

       В этих директивах проверяются аргумент_1 и аргумент_2 как строки символов. Какой именно код (фрагмент_программы_1 или фрагмент_программы_2) будет транслироваться по результатам сравнения, зависит от кода директивы. Наличие двух пар этих директив объясняется тем, что они позволяют учитывать либо не учитывать различие строчных и прописных букв. Так, директивы IFIDNI и IFDIFI игнорируют это различие, a IFIDN и IFDIF — учитывают.

       1. Директива IFIDN(I)сравнивает символьные значения аргумент_1 и аргумент_2. Если результат сравнения положительный, то транслируется и помещается в объектный модуль первый фрагмент программы. В противном случае при наличии директивы ELSE, в объектный код помещается второй фрагмент программы. Если же директивы ELSE нет, то вся часть программы между директивами IFIDN(I)и ENDIF игнорируется и в объектный модуль не включается.

       2. Действие IFDIF(I) обратно действию IFIDN(I). Если результат сравнения отрицательный (строки не совпадают), транслируется первый фрагмент программы. В противном случае все происходит аналогично рассмотренным ранее директивам.

       Как мы уже упоминали ранее, эти директивы удобно применять для проверки фактических аргументов макрокоманд. К примеру, проверим, какой из регистров — al или ah — передан в макрос в качестве параметра (проверка проводится без учета различия строчных и прописных букв):

Show macro rg

Ifdifi <al>,<rg>

Goto m_al

else

ifdifi <ah>,<rg>

goto m_ah

else

exitm

endif

endif

:m_al

:M_ah

endm

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

       Как мы неоднократно видели в приведенных ранее примерах, транслятор ТASM допускает вложенность условных директив компиляции. Более того, так как вложенность требуется довольно часто, TASM предоставляет набор дополнительных директив формата ELSEIFxxx, которые заменяют последовательность идущих подряд директив ELSE и IFxxx в структуре

IFxxx

ELSE

IFxxx

ENDIF

ENDIF

       Эту последовательность условных директив можно заменить эквивалентной последовательностью дополнительных директив

IFxxx

ELSEIFxxx

ENDIF

       Символы ххх в ELSExxx говорят о том, что каждая из директив — IF, IFB, IFIDN и т. д. — имеет соответствующую директиву ELSEIF, ELSEIFB, ELSEIFIDN и т. д. В конечном итоге это улучшает читабельность кода. В последнем примере фрагмента макроса, проверяющем, имя какого регистра было передано в макрос, наблюдается подобная ситуация. Последовательности ELSE и IFDIFI можно записать так, как в строке 4:

Show macro rg

ifdifi <al>, <rg>

goto M_al

elseifdifi <ah>, <rg>

goto M_ah

else

exitm

endif

:M_al

:M_ah

endm

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

       В языке TASM есть ряд директив, называемых директивами генерации пользовательской ошибки. Их можно рассматривать и как самостоятельное средство, и как метод, расширяющий возможности директив условной компиляции. Они предназначены для обнаружения различных ошибок в программе, таких как неопределенные метки или пропуск параметров макроса. Директивы генерации пользовательской ошибки по принципу работы можно разделить на два типа:

       1. безусловные директивы генерируют ошибку трансляции без проверки каких-либо условий;

       2. условные директивы генерируют ошибку трансляции после проверки определенных условий.

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

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

       К директивам безусловной генерации пользовательской ошибки относится только одна директива ERR (. ERR).

       Данная директива, будучи вставлена в текст программы, безусловно приводит к генерации ошибки на этапе трансляции и удалению объектного модуля. Она очень полезна при использовании с директивами условной компиляции и при включении в тело макрокоманды с целью отладки. К примеру, эту директиву можно было бы вставить в ту ветвь программы (в последнем рассмотренном нами макроопре делении), которая выполняется, если указанный в качестве аргумента регистр отличен от al и ah:

show

ifdifi

goto

else

ifdifi

goto

else

. Err

endif

endif

macro rg

M_al'

<ah>, <rg>

M_ah

endm

       Если после определенного таким образом макроопределения в сегменте кода вызвать макрокоманду show с фактическим параметром, отличным от имен регистров ah или al, будет сгенерирована ошибка компиляции (с текстом «User error »), сам процесс компиляции прекращен и, естественно, объектный модуль создан не будет.

       Остальные директивы являются условными, так как их поведение определяют некоторые условия.

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

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

Директивы . ERRB (ERRIFB)и . ERRNB (ERRIFNB)

       Синтаксис директив . ERRB (ERRIFB) и . ERRNB (ERRIFNB):

.ERRB (ERRIFB) <имя_формального_аргумента>

.ERRNB (ERRIFNB) <имя_формального_аргумента>

       Директива . ERRB (ERRIFB) вызывает генерацию пользовательской ошибки, если формальный аргумент с именем <имя_формального_аргумента> пропущен.

       Директива . ERRNB (ERRIFNB) вызывает генерацию пользовательской ошибки, если формальный аргумент с именем <имя_формального_аргумента> присутствует.

       Данные директивы применяются для генерации ошибки трансляции в зависимости от того, задан или нет при вызове макрокоманды фактический аргумент, соответствующий формальному аргументу в заголовке макроопределения с именем <имя_формального_аргумента>. По принципу действия эти директивы полностью аналогичны соответствующим директивам условной компиляции IFB и IFNB. Их обычно используют для проверки задания параметров при вызове макроса. Строка, являющаяся именем формального аргумента, должна быть заключена в угловые скобки.

       К примеру, определим обязательность задания фактического аргумента, соответствующего формальному аргументу rg, в макросе show:

Show macro rg

;если rg в макрокоманде не будет задан, то завершить компиляцию

. errb <rg>

;текст макроопределения

;. . .

endm










Последнее изменение этой страницы: 2018-04-12; просмотров: 276.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...