Глава 6. Уровни программирования.

- Я люблю сидеть низко, - заго­ворил артист, - с низкого не так опасно падать.

М.А. Булгаков Мастер и Маргарита.

I.

Будем различать три уровня программирования устройств в операционной системе MS ООБидадим следующие их определения. Высокий уровень - программирование с помощьюсистемньквызоюв(функцийпрерывания21Н,атакжепрерьтаний25Н,26Н идругих). Средний уровень - программирование при помощи функций BIOS (функции прерываний ЮН, 13Н, 15Н, 16Нидр.). Низкий уровень-программирование посред­ством обращения к аппаратуре через соответствующие порты ввода-вывода или другим способом. Надо сказать, ЧТО в литературе можно встретить и другое определение уров­ней программирования. Так, например, В [5] также выделяются три уровня программи­рования: программирование на языке высокого уровня, программирование с помощью функций DOS и BIOS и непосредственное программирование устройств.

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

Прежде чем приступить к конкретным примерам, познакомимся более подробно с операционной системой MS DOS. Загрузка операционной системы происходит с дис­кеты или с активного раздела жесткого диска. Чтобы загрузка прошла успешно нужно:

1. В первом секторе дискеты (раздела) должна содержаться загрузочная запись -маленькая программа, осуществляющая начальную загрузку операционной си­стемы.

2. Файлы MSDOS.SYS и IO.SYS, расположенные в фиксированных областяхдис-

кеты (раздела).

14 Следует отметить, что MS DOS дает широкие возможности только для работы с файлами. Все остальное представлено довольно скудно. Это, несомненно, вынуждает программистов самим программировать различные внешние устройства, что увеличивает время програм­мирования и ухудшает совместимость программных продуктов. Операционная система Windows лишена данного недостатка, там все внешние устройства программируются сред­ствами операционной системы (см. главы_24,25).

3.   Командный процессор - COMMAND£QM. файлы, перечисленные в пунктах (2) и (3), расположенныев'определенныхобластяхпамяти, атакже процедуры и дан­ные, расположенные в ПЗУ (BIOS), в совокупности составляют операционную систему MS DOS, которая обслуживает Вас во время работы на компьютере. Высокий уровень программирования (прерывания 21Н, 25Н, 26Н и др.) берет на себя MSDOS.SYS. Особенно полно здесь представлены процедуры работы с файло­вой системой. При работе с файлами редко когда появляется необходимость использо­вать средний (прерывание 13Н)или низкий уровень (практически никогда).

Файл IO.SYS существенно дополняет систему BIOS, расположенную в ПЗУ. Он выполняет следующие три основные задачи:

1. Настройка на нужды MS DOS. Оказывается, на базе BIOS работают и другие операционные системы, и все они подстраивают BIOS для своих нужд.

2. Исправление ошибок, которые могут оказаться в ПЗУ. Для того чтобы испра­вить ПЗУ, требуется больше времени, чем внести изменение в файл,

3. Управление новыми устройствами, не вошедшими в перечень устройств, об­служивание которых обеспечивает ПЗУ|5.

Одной из функций файла СОММАКО.СОМявляется интерпретация и выполне­ние команд, которые вводятся в командной строке.

п.

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

Высокий уровень. Обратимся в справочнике по MS DOS (Приложение 7) на функ­ции с номерами с 1 по ОСН. Всеэти функции отвечают заработу со стандартными уст­ройствами ввода-вывода. С двумя из функций вывода на экран Выуже познакомились -это функции с номерами 02 и 09. Они отвечают за вывод символа и вывод строки. Ранее было указано, что не все коды интерпретируются ими как символы. Чтобы вьтести на экран символы, соответствующие всем кодам, мы использовали прерытание BIOS - ЮН. Функция 06Н DOS, способная как выводить, так и вводить символы, также не может вывести на экран символы управляющих кодов. Однако это не является большим недо­статком, так как необходимость выводить такие символы появляется довольно редко.

Возможности MS DOS, однако, не исчерпываются специализированными функ­циями по выводу на экран. В операционной системе MS DOS реализован подход "опи­сателей файл а". При открытии или создании файла, DOS возвращает в регистр АХ описатель файла или HANDLE -двухбайтовое число. Все операции сданным файлом после этого можно производить, зная только это число (см. главу 8). Удобство такого подхода заключается том, что стандартным устройствам по умолчанию также при­сваиваются свои описатели - от 0 до 4. Вот эти описатели:

1 * Обслуживание новых устройств можно обеспечить за счет загружаемых или резидентных драйверов.

стандартное устройство ввода (клавиатура) - О, стандартное устройство вывода (экран) - 1, устройство для вывода ошибок (обычно экран) - 2, асинхронный порт(СОМ1) - 3, печатающее устройство (ЬРТ1) - 4.

Это позволяет легко перенаправить ввод или вывод с одного устройства на другое. Подробности работы с файлами оставим до главы 8, здесьже разберем следующий при­мер. Функция ВО840Носуществляетзаписьнадиск. Приэтом в ВХ должен находиться описатель файла, в СХ — число записываемых байтов, а Б8:БХдолжно указывать на буфер. Следующая программа будет выводить текстовый файл РРЛМЕКТХТ на экран (предварительносформируйтеегоспомощьютекстовогоредакторавтекущемкаталоге).

DSEG SEGMENT

BUFER DB 200 DUP(?) FILE    DB   ' PRIMER. TXT1 , 0

HANDLE DW ?

EOF   DB O DSEG ENDS

SSEG SEGMENT STACK

DB  30 DUP(?)

TOP DB ? SSEG ENDS CODE SEGMENT

ASSUME BEGIN:

регистры

MOV

MOV DS,AX

MOV

MOV SS,AX

MOV

/-открываем файл MOV

MOV AL,0

LEA

INT 21H

JC ER LEA

MOV BX,AX

MOV

/буфер ввода-вывода /файл в текущем каталоге /здесь храним описатель дискового файла /если 1,  то достигнут конец файла

/вызов функции открытия файла /если ошибка-закончим

ЭХ на буфер ввода-вывода

MOV

описатель по 200

байт

CIKL:

/читаем в буфер MOV АН, 3FH INT 21H

JC   CLOSE /если ошибка - закончить

СМР СХ,АХ

JZ NOT_EOF /конец файла достигнут

MOV EOF,1

MOV СХ,АХ

NOT_EOF: /пишем на  экран из буфера

MOV АН,40Н"

MOV ВХ,1 /описатель для вывода на экран

INT 21H

CMP EOF, 1 /не пора ли заканчивать

MOV ВХ,HANDLE

JZ CLOSE

читать

',—

CLOSE:

файл

MOV

INT 21H

ER:

/выйти в операционную систему

MOV

INT 21H

CODE ENDS

END BEGIN

Рис. 6.1. Программа вывода текстового файла па экран.

Детальное обсуждение работы с файлами мы отложим до главы 8. Здесь же поста­райтесь разобраться с тем, как программа работает с описателем файла. Хочу заме­тить, что вывод информации на экран с помощью функций DOS полностью иденти­чен для любого типа экрана или адаптера. Функции DOS позволяют практически от­решиться от свойств аппаратуры, чего нельзя сказать, например, о средствах BIOS. Зато средства DOS для символьного вывода слишком бедны. Выбирайте.

Вывод информации на экран на среднем уровне осуществляется посредством об­ращения к функциям прерывания ЮН, которое представляетдовольно мощный эк­ранный сервис для текстового режима. Мыуже выводили символы с помощью функ-цииОАНэтогопрерывания.Познакомимсяиснекоторымидругимивозможностями. Особенно интересны, на мой взгляд, функции 06 и 07. Они позволяют сдвигать экран или часть экрана как целое вверхили вниз на заданное число строк. Кстати, при выводе текста с помощью функций DOS происходит автоматическая прокрутка (сдвиг) эк­рана вверх - для этого какраз используется функция 06 прерывания ЮН. Здесь приво­дится процедура очистки экрана, которая также может       осуществлена с помощью

данной функции.

PROC cls

MOV СХ, 0 ; координаты левого верхнего угла СН-у, CL-x

MOV ТУХ., 184FH /координаты правого нижнего угла DH-y,DL-x MOV AL, 0        ; количество сдвигаемых строк, если 0, то весь экран MOV АН,06Н     /номер функции

цвета

INT ЮН /вызов функции

RET /возврат в основную программу

CLS ENDP

Рис. 6.2. Процедура очистки экрана.

Процедура, приведенная на Рис.6.2, является вполне законченной, и Вы можете ее использовать в своей программе. Обращаю Ваше внимание на содержимое регистра ВН. После очистки экрана текст будет обладать заданным цветом. Номер 7 соответ­ствует светло-серому цвету.

Следующая программа использует функцию 13Н прерывания ЮНдля вывода стро­ки. Данная функция позволяет выводить строку (подфункции 2,3) в формате: симв. ,-атр......Работаетонатолькодля ЕвАили УОАадапгеров.

DSEG SEGMENT

STROKA DB   'П',1, 'Р',2,'И',3,'В',4,'Е',5,'Т',6

DSEG ENDS

SSEG SEGMENT STACK

DB  60 DUP(?) TOP   DB ?

SSEG ENDS

CODE SEGMENT

ASSUME CSrCODE,  DS:DSEG, SS:SSEG BEGIN:

MOV AX, DSEG

MOV DS,AX

MOV AX,SSEG

MOV SS,AX

MOV SP, OFFSET SS:TOP

PUSH DS

POP ES /ES на сегмент данных

MOV BP,OFFSET DS:STROKA /BP на строку

MOVDX,0205H MOVAL,3 MOVAH, 13Н

;координаты 2,5 /подфункция 3 ;функция вывода строки /шесть символов (только!) /вызов прерывания

MOVCX, б

INT 1OH

MOV АН,4СН

INT 21H CODE ENDS

END BEGIN

Рис. 6.3. Программа вывода строки разноцветными буквами.

Обращаю внимание на то, что подпрограммы BIOS используют стек программы, поэтому если Вы делаете ЕХЕ-программу, то резервируйте больше места для стека. Обратимся, наконец, к непосредственной работе с экраном. Экранная память для тек-стовогорежимарасполагается, начинаясОВ800Н:ООООН (для CGA, EGA, УОАадап-теров). Каждому знакоместу на экране соответствует слово. В младшем байте содер­жится код символа, а в старшем - цвет (цвет символа, цвет фона, признак мерцания). Например, следующий фрагмент печатает букву Ав нулевой строке экрана и девятом

столбце.

MOV

MOV ES,AX

MOV BYTE PTR ES: [9], 'А' /символ MOV BYTE PTR ES: [10], 5   /цвет 5

Первые четыре бита байта цвета дают цвет символа. Таким образом, всего воз­можно 1 6 цветов. Цвета с номерами от 0 до 7 считаются тусклыми цветами, а с номе­рами от 8 до 15 - яркими. Цвет фона определяется 4,5,6 битами. Таким образом, цвет фона может быть только тусклым. Если бит 7 равен 1 ,то символ мигает. Вот, в общем, то и все. Уже теперь Вы сможете производить всевозможные манипуляции с тексто­вым экраном. Объем видеопамяти для текстового режима составляет 32 К. Отсюда следует, что в ней можно разместить 8 экранных страниц. Многие программы исполь­зуют эти страницы для своей цели. Кому не понятно, какя подсчитал количество стра­ниц, подскажу, что на экране 25 строк и 80 столбцов, а на каждый символ приходится 2 байта. Читателю, наверное, пришла в голову мысль о тени, которой модно теперь сопровождать всякий вывод информационного окна на экран. Принцип теневого за­полнения экрана довольно прост: проверяется атрибут; если цветтусклый, то засыла­ется 0 (черный цвети букв и фона), если цвет яркий, то сбрасывается битЗ, атакжевсе старшие биты. Рассмотрим теперь процедуру копирования одной видеостраницы на

другую.

COPYP PROC

все регистры,  так чтобы вызов процедуры мог производиться из любого места программы при входе в процедуру DH содержит номер куда копировать,   a       номер страницы,   откуда копировать

PUSH DS PUSH ES push ax push bx push cx push DI push si

pushf

push

dx

 

;ох нам еще понадобится

 

XOR

BH,

BH

;обнуляем ВН

 

MOV

BL,

DL

; номер страницы в ВХ

 

MOV

ax,

4000

;будем умножать на 4000

 

MUL

BX

 

;умножаем

 

MOV

SI,

AX

/смещение страницы источника в

SI

pop

dx

 

; восстанавливаемБХ

 

XOR

BH,

BH

;обнуляем ВН

 

MOV

BL,

DH

; номер страницы получателя в ВХ

 

MOV

ax,

4000

; будем умножать на 4000

 

MUL

BX

 

;умножаем

 

MOV

DI,

ax

страницы получателя в

DI

mov.

ax,

0B800H

,-сегментный адрес видеобуфера

 

MOV

ES,

ax

;в Е8

 

MOV

DS,

ax

; в Б8

 

MOV

cx,

2000

;длина страницы 2000 слов

 

cld

 

 

направления

 

rep  movsw ;копируем

; восстанавливаем регистры и выходим

P0PF

POP SI

POP DI

POP CX

POP BX

pop ax

POP ES

pop ds

RET COPY P ENDP

Puc.    Процедура копирования одной видеостраницы на другую.

Предложенная процедура очень удобна. Вы можете использовать ее не только в своих программах на ассемблере, но и на языках высокого уровня. Правда, требуется некоторая доработка. Проблема заключается в том, что данная процедура требует па­раметра. Предполагается, что этот параметр будет передаваться через регистр DX. Однако в языках высокого уровня принято передавать параметр через стек. Как видо­изменить процедуру, чтобы она начала работать и для языков высокого уровня, Вы узнаете в главе 15.

III.

Здесь кратко перечислены стандартная аппаратура и средства работы с нейна всех трехуровнях.

<Принтер>

Высокий уровень - функция DOS 05 или метод описателей

с предопределенным номером 4.

Средний уровень - прерывание BIOS 17Н. ($)

Низкий уровень - порты ввода-вывода параллельного адаптера.

<Клавиатура.>

Высокий уровень - ввод с помощью стандартных функций DOS или с помощью описателя файла 0 ($). Средний уровень - прерывание BIOS 16Н, буфер клавиатуры ($). Низкий уровень - порты клавиатуры с перехватом прерывания 9Н.

<Последовательныйпорт.>

Высокий уровень - функция DOS 04 или вывод с помощью описателя 03. Средний уровень - использование функций прерывания 14Н. Низкий уровень - обращение непосредственно к портам адаптера.

<Дисковыенакопители.>

Высокий уровень - богатый выбор функций DOS, а также прерывания 25Н и 26Н. ($)

Средний уровень-прерывание 13Н-абсолютная запись на диск. Низкий уровень - порты контролера диска. (@)

<Дисплей, графическиережимы> Высокий уровень - нет средств. Средний уровень - функции прерывания ЮН. Низкий уровень - порты адаптера дисплея. ($)

Значок $ означает - употребляется чаще всего. Значок @ означает - почти не употребляется.

IV. Программирование звука.

Что за звуки!Неподвижен, внемлю

Сладким звукам я...

М.Ю.Лермонтов.

В DOS и BIOS отсутствуют какие-либо средства, позволяющие извлекать звук из динамика компьютера, кроме разве что посылки кода 7 через стандартные функции вывода (MOV DL,7/MOV АН,2Яет 21Н). В основе генерации звука лежит взаимодей­ствие микросхемы таймера и динамика. Микросхема таймера считает импульсы, по­лучаемые от тактового генератора, и может по прошествию определенного количе­ства импульсов (это можно запрограммировать) выдавать на выход сигнал. Если эти сигналы направить вход динамика, то будет произведен звук. Высота его будет за­висеть от частоты поступления сигналов вход динамика. Вот кратко идея генера­ции звука в стандартной конфигурации IBM PC. А сейчас об этом более подробно (описание таймера см. в Приложении 9).

Микросхема таймера имеет три канала. Канал 0 отвечает за ход системных

часов. Сигнал с этого канала вызывает прерывание времени. раз в секунду выполняется на которую направлен вектор с номером 8. Это процеду-

ра производит изменения в области памяти, где хранится текущее время. В спе­циальном регистре задвижки хранится число синхроимпульсов, по прошествии которых сигнал таймера должен вызвать прерывание времени. Уменьшая это число (через порт канала), можно заставить идти системные часы быстрее. Адрес пор­та канала 0 - 40Н.

Канал 1 отвечает зарегенерацию памяти. Адрес порта этого канала - 41Н. В прин­ципе можно уменьшить число циклов регенерации памяти в секунду, что может не­сколько увеличить производительность компьютера. Однако это можно сделать лишь в некоторых пределах, т.к. при увеличении промежутка регенерации возрастает веро­ятность сбоя памяти.

Канал 2 обычно используетсядляработы сдинамиком, хотя сигналы с него можно использовать и для других целей. Адрес порта этого канала - 42Н. Идея генерации звука проста. В порт42Н посылается число (счетчик). Немедленно значение счетчика начинает уменьшаться. По достижению 0 на динамик подается сигнал. После чего процесс повторяется. Чем больше значение счетчика, реже подается сигнал тем ниже звук.

Связь канала 2 с динамиком устанавливается через порт 61Н. Если бит 1 этого порта установлен в 1, то канал 2 посылает сигналы на динамик. Кроме того, чтобы разрешить поступления сигнала от тактового генератора в канал 2      0 этого порта

должен быть равен 1 (уровень сигнала высокий).

Для программирования каналов требуется установить порте адресом 43Н.

ниже.

 

Бит

Значение

О

0 - двоичные данные, 1 - данные в двоично-десятичном виде;

1-3

номер режима, обычно используется режим 3;

4-5

тип операции:

00 передать значение счетчика в задвижку,

01 читать/писать только старший байт,

10 читать/писать только младший байт,

11 читать/писать старший байт, потом младший;

6-7

номер программируемого канала (0-2).

CODE SEGMENT

ORG 100Н

ASSUME CSrCODE BEGIN:

MOV AL,10110110B /установка режима записи

OUT 43H,AL IN    AL,61H

OR    AL,3 ;разрешить связь   с таймером

OUT 61H,AL mov AX,1200 ;установить частоту звука

;таймер начинает действовать немедленно по счетчика OUT 42H,AL mov AL,АН

OUT 42H,AL MOV CX,OFFFFH

;задержка

LOO: LOOP LOO

канал от динамика,    т.е.  прекратить звук IN   AL,61H AND AL, 11111100B OUT 61H,AL RET CODE ENDS

END BEGIN

Puc. 6.5. Программа, производящая короткий звуковой сигнал.

В программе, представленной на Рис. 6.5, дан механизм создания звуковых эф­фектов. Вы можете использовать его в своих программах. Есть два основных подхода создания в программе для MS DOS звукового (музыкального) оформления. Первый подход заключается в циклическом обращении к соответствующей процедуре. В этом случае фактически Программа не сможет выполнять другую работу. Другой способ позволяет создавать музыкальный фон, программа при этом может заниматься своими делами. При этом производительность ее снижается очень незначительно. Суть идеи заключается в использовании прерывания по времени. Соответствующий вектор на­правляется на процедуру, и к ней периодически происходит обращение уже независи­мо от того, что выполняет программа. О том, как это сделать, Вы узнаете в следующих главах.

Как уже говорилось, микросхема таймера служит для получения системой инфор­мации о текущем времени и дате, которые можно получить или установить с помо­щью функций прерывания 21Н: 2АН, 2ВН, 2СН, 2DH. ' В свою очередь, прерывание BIOS 1 АН позволяет получить количество тиков системных часов, прошедших с мо-ментаустановки. Одинтик=(1/18.2). Во многихслучаяхудобнее пользоваться именно этим прерыванием, а не функциями MS DOS. На компьютерах класса AT есть встро­енные часы реального времени, которые идут независимо от системных и при отклю­ченном питании. Доступ к ним можно осуществить также через прерывание 1 АН. После запуска компьютера системные часы устанавливаются по часам реального времени. В дальнейшем они идут независимо. Программная модель часов реального времени из­ложена в Приложении 9.