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

Глава 2

Г

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

команд, начиная с адреса FFFEh, Поскольку наша программа имеет раз­мер, существенно меньше 64К, такое расположение стека не приведет ни к каким неприятностям (при большом размере программы стек мог бы начать затирать нижние строки программы).

В программе проиллюстрировано использование в качестве фактичес­кого аргумента макрокоманды различных конструкций языка: непосред­ственного обозначения символа (что, наверное, лишено смысла), прямо­го обращения к различным участкам памяти по абсолютным адресам че­рез регистры ES и DS, адресации с использованием символического обозначения поля данных. На рис. 2.18 приведен вывод программы.

FACURREMT>p.exe u=OK*

Рис. 2.18. Вывод программы 2.1.

Как уже отмечалось, при загрузке программы в память в регистры DS и ES заносится сегментный адрес префикса программы, поэтому адреса­ция через ES позволяет прочитать содержимое PSP. Префикс содержит, главным образом, данные, необходимые системе для обслуживания теку­щей программы, но, кроме того, и несколько команд. В частности, пре­фикс начинается с команды CD 20h, которая уже давно не используется, но в префиксе присутствует ради обеспечения' совместимости со старыми версиями DOS. Первый байт этой команды, если его рассматривать, как код символа, соответствует элементу двойной горизонтальной рамки (длин­ный знак равенства).

Занеся в регистр DS число 40U, мы настроили его на начало области данных BIOS, которая начинается с абсолютного адреса 400h, занимает 256 байт и содержит разнообразные данные, используемые BIOS в про­цессе обслуживания аппаратуры компьютера. Так, например, по адресу О от начала этой области хранится базовый адрес первого последовательно­го порта; по адресу 8 — адрес первого параллельного порта, а по адресу 49h — код текущего видеорежима. При работе в DOS видеоадаптер обыч­но настраивается на режим 3 (80x25 символов, 16 цветов). Будучи выведен на экран, код 3 образует изображение червонного туза.

В тех случаях, когда макрокоманды состашгяются для конкретной про­граммы, они включаются в текст программы так, как это было сделано в примере 2.1. Однако часто программист оформляет в виде макрокоманд стандартные процедуры общего назначения, например, программную за­держку или вывод на экран строки текста. В этом случае тексты макрооп­ределений целесообразно поместить в макробиблиотеку.

Макробиблиотека представляет собой файл с текстами макроопре­делений. Макроопределения записываются в этот файл точно в таком же виде, как и в текст программы. Ниже приведен текст файла макро­библиотеки с произвольным именем MYMACRO.MAC, содержащей две макрокоманды.

;Макрокоманда endpr завершения программы

endpr macro Макрокоманда без параметров

mov AX,4COOh

hit 21h

endm ;Конец макрокоманды Макрокоманда delay настраиваемой программной задержки

delay macro time ;Параметр — число шагов

local Iabell,label2 ;Локальньге метки

push CX , ;Сохраним внешний счетчик

mov CX,time ;Получим фактический параметр

Iabel2: push CX ;Сохраним его в стеке

mov СХ,0 ;Пустъ будет 64К шагов

labell: loop lanell ;Внутренний цикл

pop CX ;Извлечем внешний счетчик

loop Iabel2 ;Внешний цикл

pop CX восстановим CX программы

endm ;Конец макрокоманды

. Для того чтобы транслятору были доступны макрокоманды из файла MYMACRO.MAC, его следует на этапе трансляции подсоединить к ис­ходному тексту программы директивой ассемблера include:

include mymacro.mac

Все макрокоманды, включенные в этот файл, можно использовать в любом месте программы.

Директивы условной трансляции

Директивы условной трансляции (условного ассемблирования) позво­ляют иметь в исходном тексте программы различные варианты отдельных фрагментов программы, и путем задания определенных условий управлять процессом трансляции. Таким образом можно, например, включать или исключать из текста программы служебные, отладочные фрагменты или настраивать программ)' для выполнения на заданном процессоре.

Пусть, например, в процессе отладки сложной программы мы ис­пользуем подпрограмму regs вывода на экран содержимого всех регистров процессора. Включая в разные места программы вызов этой подпрограм­мы, мы имеем возможность контролировать ход ее выполнения, в том числе и такие тонкие моменты, как, например, расположение програм­мы в памяти или интенсивность использование стека. Для управления процессом трансляции предусмотрим константу debug (отладка), ненуле­вое значение которой будет требовать отладочного варианта трансляции, а нулевое — рабочего. Начало программы, а также участки с вызовом отладочной подпрограммы будут выглядеть следующим образом:

;debug=l ;Удалите символ ';'для отладочной трансляции

;debug=0 ;Удалите ';' для рабочей трансляции

;Текст программы

94