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

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.

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