Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

Основы программирования

95

if debug

call endif

if debug

call endif

regs

regs

Транслировать только если debug=l ;Вызов отладочной подпрограммы ;Конец блока условной трансляции Продолжение профаммы ;Следующее включение отладочного блока

push push push push push push endif

CX

DX

BX

BP

SI

DI

if 1386

рора

else

pop

DI

pop

SI

pop

BP

pop

BX

pop

DX

pop

CX

pop

AX

endif

Если в начале программы имеется объявление 1386=1, то, во-первых, в программу будет включена директива, .386, позволяющая использовать в программе дополнительные команды, а во-вторых, в последующих ус­ловных блоках будут транслироваться те их участки, которые содержат команды процессора 80386. Если же объявление i386=l изъять, то в услов­ных блоках будут транслироваться эквивалентные по существу, но менее эффективные последовательности команд МП 86.


Продолжение программы

Разумеется, можно отлаживать программу в отладочном варианте, а затем удалить все вызовы вспомогательной подпрограммы regs вручную и получить рабочий вариант, однако на практике обычно (или даже всегда) оказывается, что после эксплуатации программы в течение некоторого времени в ней обнаруживаются незамеченные ранее ошибки, что приво­дит к необходимости снова вставлять в нее отладочные строки. Часто эту процедуру приходится повторять многократно. Использование в програм­ме директив условной трансляции сокращают процедуру преобразования программы из отладочного варианта в рабочий или наоборот до операции стирания одного символа «;» в начале программы И устраняют вероят­ность случайного внесения в программу новых ошибок в процессе удале­ния или вставки отладочных строк.

Рассмотрим еще один пример применения директив условной транс­ляции. Как уже отмечалось, современные процессоры предоставляют про­граммисту значительное количество дополнительных команд, которые можно использовать в программах реального режима, но только, разуме­ется, если компьютер оснащен соответствующим процессором. Нетрудно составить универсальную программу, которую можно выполнять как на современных процессорах (в более эффективном режиме), так и на более старых (с некоторой потерей эффективности), если включить в нее ди­рективы условной трансляции этих дополнительных команд. К таким ко­мандам, в частности, относятся команды сохранения в стеке всех регист­ров общего назначения pusha и восстановления всех регистров рора. При­ведем пример условной трансляции этих команд, в котором используется конструкция макроязыка if... else... endif:

i386=l

if i386

.386

endif

code segment useI6

assume CS:code

main proc

if i386

pusha else

push AX

;Сохранение всех регистров одной командой

Использование регистров после ;сохранения их исходных значений

;Восстановление всех регистров одной командой

Команды и алгоритмы

97