<<
>>

Директивы IFDEF и IFNDEF

Синтаксис директив IFDEF и IFNDEF следующий: IF(N)DЕF символическое_имя фраrмент_программы_l ELSE фрагмент_программы_2 ENDIF Данные директивы позволяют управлять трансляцией фрагментов программы в зависимости от того, определено или нет в программе некоторое символическое имя.
Директива IFDEF проверяет, описано или нет в программе символическое имя, и если это так, то в объектный модуль помещается первый фрагмент програм- мы (фраrмент_программы_l). В противном случае при наличии директивы ELSE в объектный код помещается второй фрагмент программы (фраrмент_програм- мы_2). Если же директивы ELSE нет (и символическое имя в программе не опи- сано), то вся часть программы между директивами IF и ENDIF игнорируется и в объектный модуль не включается. Действие IFNDEF обратно действию IFDEF. Если символического имени в про- грамме нет, то транслируется первый фрагмент программы. Если оно присут- ствует, то при наличии ELSE транслируется второй фрагмент программы. Если ELSE отсутствует, а символическое имя в программе определено, то часть про- граммы, заключенная между IFNDEF и ENDIF, игнорируется. В качестве примера рассмотрим ситуацию, когда в объектный модуль програм- мы должен быть включен один из трех фрагментов кода в зависимости от значе- ния некоторого идентификатора switch: ⅛s если switch = 0, то сгенерировать фрагмент для вычисления выражения у = х ∙ 2"; l® если switch = 1, то сгенерировать фрагмент для вычисления выражения у =х/2"\ . если идентификатор switch не определен, то ничего не генерировать. Соответствующий фрагмент исходной программы может выглядеть так: ifпdеf sw ;если sw не определено, то выйти из макроса EXITM else ;иначе - на вычисление ■ гаоv сl,п if e sw sаl х,сl ;умножение на степень 2 312 Глава 14. Макросредства языка ассемблера ;сдвигом влево else sar X,сl;деление на степень 2 ;сдвигом вправо епd1 f епdi f Как видим, эти директивы логически связаны с директивами IF и IFE, то есть их можно применять в тех же самых случаях, что и последние.
Есть еще одна интерес- ная возможность использования этих директив. В главе б мы обсуждали формат командной строки TASM и говорили о ключах, которые можно в ней задавать. Далее приведен один из них (см. приложение В, http: //www.piter.com/download): /dимя_идентификатора[=значение] Использование этого ключа дает возможность управлять значением иденти- фикатора прямо из командной строки, не меняя при этом текста программы. В ка- честве примера рассмотрим листинг 14.5. В этом коде мы пытаемся с помощью макроса контролировать процесс резервирования и инициализации некоторой области памяти в сегменте данных. Листинг 14.5. Инициализация значения идентификатора из командной строки Запустив этот пример на трансляцию, вы получите сообщение о том, что забы- ли определить значение переменной size_m. Исправить эту ошибку можно одним из двух способов: ii в начале исходного текста программы определите значение этой переменной с помощью псевдооператоа EQU: sizе_m еqu 15 ii запустите программу на трансляцию командной строкой вида tаsiп /dsizе_m=15 /zi рrg_lЗ_2,,, В листинге 14.5 мы использовали еще одну возможность транслятора — дирек- тиву DISPLAY, с помощью которой можно формировать пользовательское сообще- ние в процессе трансляции программы. Директива DISPLAY будет рассмотрена в конце данной главы.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Директивы IFDEF и IFNDEF:

  1. Антисценарий
  2. Транзиты Меркурия, Венеры и Марса:
  3. Родительские образцы
  4. Акты Президента
  5. Возражения с позиций психологии развития
  6. Возраженияс позиций психологии развития
  7. 1.4ДВИЖЕНИЕПЛАНЕТ
  8. Перемешивание элементов сценария
  9. Нормативные правовые акты правительства
  10. Перемешивание элементов сценария
  11. У всех ли есть сценарий?
  12. Особенности детско?родительских отношений
  13. Сценарий и антисценарий
  14. Внутреннее освобождение
  15. Родительские образцы
  16. Сценарий и антисценарий
  17. "Расписание" транзитов
  18. 15.4. Джерела міжнародного трудового права