Директивы IF и IFE

Синтаксис этих директив следующий:

IF(E) логическое_выражениефрагмент_программы_1 ELSEфрагмент_программы_2ENDIF

Обработка этих директив макроассемблером заключается в вычислении логического_выражения и включении в объектный модуль фрагмент_программы_1 или фрагмент_программы_2 в зависимости от того, в какой директиве IF или IFE это выражение встретилось:

· если в директиве IF логическое выражение истинно, то в объектный модуль помещается фрагмент_программы_1. Если логическое выражение ложно, то при наличии директивы ELSE в объектный код помещается фрагмент_программы_2. Если же директивы ELSE нет, то вся часть программы между директивами IF и ENDIF игнорируется и в объектный модуль ничего не включается. Кстати сказать, понятие истинности и ложности значения логического_выражения весьма условно. Ложным оно будет считаться, если его значение равно нулю, а истинным — при любом значении, отличном от нуля.

· директива IFE аналогично директиве IF анализирует значение логического_выражения. Но теперь для включения фрагмент_программы_1 в объектный модуль требуется, чтобы логическое_выражение имело значение “ложь”.

Директивы IF и IFE очень удобно использовать при необходимости изменения текста программы в зависимости от некоторых условий.

К примеру, составим макрос для определения в программе области памяти длиной не более 50 и не менее 10 байт (Пример 5).

Пример 5. Использование условных директив IF и IFE<1>;----------------------------------------------<2>masm<3>model small<4> stack 256<5> def_tab_50 macro len<6>if len GE 50<7>GOTO exit<8>endif<9> if len LT 10<10>:exit<11>EXITM<12>endif<13>rept len<14> db 0<15>endm<16>endm<17>.data<18>def_tab_50 15<19> def_tab_50 5<20>.code<21>main:<22> mov ax,@data<23> mov ds,ax<24>exit:<25> mov ax,4c00h<26> int 21h<27>end mainENDIF

Введите и оттранслируйте программу из Примера 5. При этом не забывайте о том, что условные директивы действуют на шаге трансляции, и поэтому результат их работы можно увидеть только после макрогенерации, то есть в листинге программы. В нем вы увидите, что в результате трансляции строка 18 развернется в пятнадцать нулевых байт, а строка 19 оставит макрогенератор совершенно равнодушным, так как значение фактического операнда в строках 6 и 9 будет ложным. Обратите внимание, что для обработки реакции на ложный результат анализа в условной директиве мы использовали макродирективы EXITM и GOTO.

Другой интересный и полезный вариант применения директив IF и IFEотладочная печать. Суть здесь в том, что в процессе отладки программы почти всегда возникает необходимость динамически отслеживать состояние определенных программно- аппаратных объектов, в качестве которых могут выступать переменные, регистры микропроцессора и т. п. После этапа отладки отпадает необходимость в таких диагностических сообщениях. Для их устранения нужно корректировать исходный текст программы, после чего ее следует подвергнуть повторной трансляции. Но есть более изящный выход.

Можно определить в программе некоторую переменную, к примеру debug, и использовать ее совместно с условными директивами IF или IFE. К примеру,

<1>...<2>debug equ 1<3>...<4>.code<5>...<6>if debug<7>;любые команды и директивы ассемблера<8>;(вывод на печать или монитор)<9>endif

На время отладки и тестирования программы вы можете заключить отдельные участки кода в своеобразные операторные скобки в виде директив IF и ENDIF (строки 6-9 последнего фрагмента), которые реагируют на значение логической переменной debug. При значении debug = 0 транслятор полностью проигнорирует текст внутри этих условных операторных скобок; при debug = 1, наоборот, будут выполнены все действия, описанные внутри них.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: