- •1. Основы программирования для dos 9
- •1.1.7. Средства bios 21
- •2. Приемы системного программирования 57
- •Введение
- •1.Основы программирования для dos
- •1.1. Структура и выполнение программ в dos
- •Программа типа сом
- •Программа типа ехе
- •1.2.Использование служебных функций dos и bios
- •1.3.Вывод на экран в текстовом режиме
- •Средства dos
- •Средства bios
- •Выбор видеорежима
- •Управление положением курсора
- •Вывод символов на экран
- •Прямая работа с видеопамятью
- •1.4.Ввод с клавиатуры
- •Средства dos
- •Средства bios
- •1.5.Графические видеорежимы
- •Работа со стандартными графическими режимами
- •Работа с svga-режимами
- •(Продолжение таблицы 4)
- •(Окончание таблицы 4)
- •1.6.Работа с мышью
- •1.7.Другие устройства
- •Системный таймер
- •Последовательный порт
- •Параллельный порт
- •1.8.Работа с файлами
- •Создание и открытие файлов
- •Чтение из файла и запись в файл
- •Закрытие и удаление файла
- •Поиск файлов
- •Управление файловой системой
- •1.9.Управление памятью
- •Обычная память
- •Область памяти umв
- •Область памяти нма
- •Интерфейс ems
- •Интерфейс xms
- •1.10.Организация процессов
- •Запуск программ на выполнение
- •Переменные окружения
- •Командные параметры
- •2.Приемы системного программирования
- •2.1.Управляющие структуры
- •Структуры if... Then... Else
- •Структуры case
- •Конечные автоматы
- •2.2.Процедуры и функции
- •Передача параметров
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по возвращаемому значению
- •Передача параметров по результату
- •Передача параметров по имени
- •Передача параметров отложенным вычислением
- •Передача параметров в регистрах
- •Передача параметров в глобальных переменных
- •Передача параметров в стеке
- •Передача параметров в потоке кода
- •Передача параметров в блоке параметров
- •Локальные переменные
- •2.3.Обработка прерываний
- •Обработчики прерываний
- •Прерывания от внешних устройств
- •Взаимодействие прикладных и системных обработчиков прерываний
- •2.4.Резидентные программы
- •Системные средства организации резидентных программ
- •Взаимодействие с резидентной программой
- •2.5.Драйверы устройств в dos
- •Литература
Прямая работа с видеопамятью
Для того чтобы текстовое или графическое изображение появилось на экране монитора, оно должно быть записано в память видеоадаптера. Функции BIOS вывода на экран также, в конечном счете, осуществляют запись указанных данных в видеопамять.
В адресном пространстве центрального процессора отведены определенные области адресов для обращения к видеопамяти. Область памяти, начинающаяся с абсолютного адреса B800h:0000h и заканчивающаяся адресом B800h:FFFFh соответствует видеопамяти для текстовых режимов. Все, что программы пишут по этим адресам, немедленно пересылается в память видеоадаптера.
В текстовых режимах для хранения каждого отображаемого символа используется словная ячейка, первый байт которой содержит ASCII-код символа, а второй — его атрибут. Так, например, по адресу B800h:0000h находится байт с кодом символа, находящимся в верхнем левом углу экрана; по адресу B800h:0001h находится атрибут этого символа; по адресу B800h:0002h находится код второго символа в верхней строке экрана и т. д.
Таким образом, любая программа может вывести текст на экран простой командой пересылки данных, не прибегая ни к каким специальным функциям DOS или BIOS.
; Вывод символа на экран с помощью записи его кода в видеопамять
mov ax, 0B800h ; сегментный адрес текстового видеобуфера
mov es, ax ; занесем в ES
mov al, '$' ; код символа
mov ah, 1110000b ; атрибут – черным цветом на сером фоне
mov es:[(12*80+40)*2], ax ; запишем в середину видеобуфера
Часто при прямом выводе данных необходимое изображение подготавливают в виде массива данных в памяти, который затем копируется в видеопамять с помощью строковой команды пересылки MOVS.
1.4.Ввод с клавиатуры
Средства dos
Как и в случае вывода на экран, DOS предоставляет набор функций для чтения данных со стандартного устройства ввода STDIN, в качестве которого может использоваться клавиатура, файл или стандартный вывод другой программы.
Функция DOS 0Ah — Считать строку символов из STDIN в буфер
Ввод: АН = 0Ah
DS:DX = адрес подготовленного буфера
Вывод: Буфер содержит введенную строку
Для вызова этой функции надо подготовить буфер, первый байт которого содержит максимальное число символов для ввода (1 - 254), а содержимое, если оно задано, может использоваться как подсказка для ввода (предопределенная строка).
Функция 0Ah используется командным процессором для ввода команд пользователя, поэтому правила ввода строки здесь те же, что и при вводе команд в командной строке DOS. При наборе строки обрабатываются клавиши Esc, F3, F5, BS (Backspace), Ctrl-C/Ctrl-Break. После нажатия клавиши Enter строка (включая последний символ CR (0Dh), вызванный нажатием Enter) записывается в подготовленный буфер, начиная с третьего байта. Во второй байт записывается длина реально введенной строки без учета последнего CR.
Функция 0Ah предоставляет удобный, но ограниченный способ ввода данных. Если требуется контролировать отображение символов на экране, реакцию программы на функциональные и управляющие клавиши и т. д., используют функции посимвольного ввода.
Функция DOS 01h — Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl-Break.
Ввод: АН = 01h
Вывод: AL = ASCII-код символа или 0. Если AL = 0, второй вызов этой функции возвратит в AL расширенный ASCII-код символа.
При чтении с помощью этой функции введенный символ автоматически немедленно отображается на экране (STDOUT). При нажатии Ctrl-C или Ctrl-Break работа функции прерывается (выполняется команда INT 23h). Если нажата клавиша, не соответствующая какому-нибудь символу (клавиши управления курсором и редактирования, функциональные клавиши), или же некоторая комбинация клавиш, то в AL возвращается 0 и функцию надо вызвать еще один раз, чтобы получить расширенный ASCII-код. В табл. 2 приведены наиболее распространенные клавиши и комбинации, генерирующие расширенные ASCII-коды.
В трех следующих вариантах функции 1 код символа возвращается в AL по такому же принципу.
Функция DOS 08h — Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break
Ввод: АН = 08h
Вывод: AL = код символа
Функция DOS 07h — Считать символ из STDIN без эха, с ожиданием и без проверки на Ctrl-Break
Ввод: АН = 07h
Вывод: AL = код символа
Функция DOS 06h — Считать символ из STDIN без эха, без ожидания и без проверки на Ctrl-Break
Ввод: АН = 06h
DL = 0FFh
Вывод: ZF = 1, если не была нажата клавиша, и AL = 0
ZF = 0, если клавиша была нажата; в этом случае AL = код символа
Кроме перечисленных функций могут потребоваться и некоторые служебные функции DOS для работы с клавиатурой.
Функция DOS 0Bh — Проверить состояние клавиатуры
Ввод: АН = 0Bh
Вывод: AL = 0, если не была нажата клавиша
AL = 0FFh, если была нажата клавиша
Эту функцию удобно использовать перед функциями 01, 07 и 08, чтобы не ждать нажатия клавиши.
Функция DOS 0Сh — Очистить буфер и считать символ
Ввод: АН = 0Сh
AL = Номер функции DOS (01, 06, 07, 08, 0Ah)
Вывод: Зависит от вызванной функции
На уровне BIOS ввод с клавиатуры буферируется, то есть коды нажимаемых клавиш сохраняются в специальном буфере клавиатуры в памяти. Это дает пользователю возможность начать вводить команду еще до того, как система освободилась и управление получил командный процессор. Функции ввода с ожиданием, рассмотренные выше, вначале проверяют состояние буфера клавиатуры, и только если он пуст, ожидают ввод.
Функция 0Ch используется как менеджер вызова одной из описанных функций ввода с предварительной очисткой буфера клавиатуры. В результате указанная подфункция чтения символа обязательно будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Например, именно эта функция используется для считывания ответа на вопрос о форматировании диска.
Функции посимвольного ввода без эха можно использовать для интерактивного управления программой.
Таблица 2. Некоторые расширенные коды ASCII
-
Клавиша
Код (hex)
Клавиша
Код (hex)
Клавиша
Код (hex)
Клавиша
Код (hex)
Клавиша
Код (hex)
F1
3Bh
Alt-A
1eh
Alt-M
32h
Alt-Y
15h
Alt--
82h
F2
3Ch
Alt-B
30h
Alt-N
31h
Alt-Z
2ch
Alt-=
83h
F3
3Dh
Alt-C
2eh
Alt-O
18h
Alt-0
81h
Ins
52h
F4
3Eh
Alt-D
20h
Alt-P
19h
Alt-1
78h
Del
53h
F5
3Fh
Alt-E
12h
Alt-Q
10h
Alt-2
79h
left
4Bh
F6
40h
Alt-F
21h
Alt-R
13h
Alt-3
7ah
right
4Dh
F7
41h
Alt-G
22h
Alt-S
1fh
Alt-4
7bh
up
48h
F8
42h
Alt-H
23h
Alt-T
14h
Alt-5
7ch
down
50h
F9
43h
Alt-I
17h
Alt-U
16h
Alt-6
7dh
Home
47h
F10
44h
Alt-J
24h
Alt-V
2fh
Alt-7
7eh
End
4fh
F11
85h
Alt-K
25h
Alt-W
11h
Alt-8
7fh
PgUp
49h
F12
86h
Alt-L
26h
Alt-X
2dh
Alt-9
80h
PgDn
51h