- •Source Directory
- •IncludEимя_файла_с_путём
- •Include dop1.Asm
- •Операции
- •Взаимодействие с языками высокого уровня.
- •II equ word ptr ll ; Равно5678h
- •I2 equ word ptr c2 ; Равно…
- •Id_table label byte
- •Id_table label byte
- •Irp формальный_аргумент,
- •Irpc формальный_аргумент,строка_символов
- •Irpc rg,
- •IFxxx логическое_выражение_или_аргументы
- •If(e) логическое_выражение
- •If(n)def символическое_имя
- •Ifndef sw ;если sw не определено, то выйти из макроса
- •If(n)b аргумент
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.
Синтаксис этих директив следующий: