Справочник по языку Ассемблера IBM PC



канистры для воды пластиковые В наличии. |

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


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

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

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

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

    значения логического_выражения весьма условно. Ложным оно будет считаться, если его значение равно нулю, а истинным — при любом значении, отличном от нуля.

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

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

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

Листинг 5. Использование условных директив IF и IFE ;prg_13_4.asm masm model small stack 256 def_tab_50 macro len if len GE 50 GOTO exit endif if len LT 10 :exit EXITM endif rept len db 0 endm endm .data def_tab_50 15 def_tab_50 5 .code main: mov ax,@data mov ds,ax exit: mov ax,4c00h int 21h end main ENDIF

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

Другой интересный и полезный вариант применения директив IF




Содержание  Назад  Вперед