Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M2 / Лекция 2.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
207 Кб
Скачать
☆

IFxxx логическое_выражение_или_аргументы

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

ELSE

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

ENDIF

Заключение некоторых фрагментов текста программы – фрагмент_программы_1 и фрагмент_программы_2 –между директивами IFxxx, ELSE и ENDIF приводит к их выборочному включению в объектный модуль. Какой именно из этих фрагментов –фрагмент_программы_1 или фрагмент_программы_2 – будет включен в объектный модуль, зависит от конкретного типа условной директивы, задаваемого значением xxx, и значения условия, определяемого операндом (операндами) условной директивы логическое_выражение_или_аргумент(ы).

Синтаксические конструкции, соответствующие директивам условной компиляции, могут быть вложенными друг в друга.

Директивы 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 байт.

<1>; Использование условных директив IF и IFE

<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 ; развернётся в 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 main

ENDIF

Вы увидите, что в результате трансляции строка 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, наоборот, будут выполнены все действия, описанные внутри них.

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

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