- •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
- •Литература
О десский национальный морской университет
Кафедра информационных технологий
А. Д. Бодарев,
СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
НА ЯЗЫКЕ АССЕМБЛЕРА
Методическое пособие
по теме
«ПРОГРАММИРОВАНИЕ ДЛЯ DOS»
Одесса 2010
СОДЕРЖАНИЕ
СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ 1
Методическое пособие 1
Одесса 2010 2
ВВЕДЕНИЕ 8
1. Основы программирования для dos 9
1.1. Структура и выполнение программ в DOS 9
1.1.1. Программа типа СОМ 10
1.1.2. Программа типа ЕХЕ 12
1.2. Использование служебных функций DOS и BIOS 13
1.3. Вывод на экран в текстовом режиме 14
1.1.3. Средства DOS 14
Функция DOS 02h — Записать символ в STDOUT с проверкой на Ctrl-Break 14
Функция DOS 06h — Записать символ в STDOUT без проверки на Ctrl-Break 14
Функция DOS 09h — Записать строку в STDOUT с проверкой на Ctrl-Break 15
Функция DOS 40h — Записать строку в файл или устройство 15
INT 29h — Быстрый вывод символа на экран 15
1.1.4. Средства BIOS 16
INT 10h, АН = 4Fh, AL = 2 — Установить SuperVGA-видеорежим 16
Ввод: ВХ — номер режима в младших 13 битах 16
INT 10h, АН = 2 — Установить положение курсора 16
Ввод: АН = 2 16
INT 10h, АН = 3 — Считать положение и размер курсора 17
Ввод: АН = 3 17
Таблица 1. Атрибуты символов 17
INT 10h, АН = 8 — Считать символ и атрибут символа в текущей позиции курсора 17
INT 10h, АН = 9 — Вывести символ с заданным атрибутом на экран 17
INT 10h, АН = 0Ah — Вывести символ с текущим атрибутом на экран 18
INT 10h, АН = 0Eh — Вывести символ в режиме телетайпа 18
Ввод: АН = 0Eh 18
INT 10h, АН = 13h — Вывести строку символов с заданными атрибутами 18
Ввод: АН = 13h 18
1.1.5. Прямая работа с видеопамятью 18
1.4. Ввод с клавиатуры 19
1.1.6. Средства DOS 19
Функция DOS 0Ah — Считать строку символов из STDIN в буфер 19
Функция DOS 0Bh — Проверить состояние клавиатуры 20
Функция DOS 0Сh — Очистить буфер и считать символ 20
Таблица 2. Некоторые расширенные коды ASCII 20
1.1.7. Средства bios 21
INT 16h, АН = 0, 10h, 20h — Чтение символа с клавиатуры с ожиданием 21
INT 16h, АН = 1, 11h, 21h — Проверка символа 21
INT 16h, АН = 05h — Поместить символ в буфер клавиатуры 21
Ввод: АН = 05h 21
INT 16h, АН = 02h, 12h, 22h — Считать состояние (флаги) клавиатуры 22
1.5. Графические видеорежимы 23
1.1.8. Работа со стандартными графическими режимами 23
INT 10h, АН = 0Ch — Вывести точку на экран 23
Ввод: АН = 0Сh 23
Таблица 3. Основные графические режимы 24
INT 10h, АН = 0Dh — Считать точку с экрана 24
Ввод: АН = 0Dh 24
1.1.9. Работа с SVGA-режимами 25
Таблица 4. Графические режимы SVGA 26
INT 10h АН = 4Fh, AL = 0 — Получить общую SVGA-информацию 26
Ввод: AX = 4F00h 27
INT 10h АН = 4Fh, AL = 01 — Получить информацию о режиме 27
Ввод: AX = 4F01h 27
INT 10h АН = 4Fh, AL = 02 — Установить режим 27
Ввод: AX = 4F02h 27
INT 10h АН = 4Fh, AL = 03 — Узнать номер текущего видеорежима 28
Ввод: AX = 4F03h 28
INT 10h АН = 4Fh AL = 05 — Перемещение окна (переключение банка видеопамяти) 28
Ввод: AX = 4F05h 28
INT 10h, АН = 4Fh, AL = 07 — Установка начала изображения 28
Ввод: АХ = 4F07h 28
1.6. Работа с мышью 28
INT 33h, AX = 0 — Инициализация мыши 28
Ввод: AX = 0000h 28
Выполняется аппаратный и программный сброс мыши и драйвера. 28
INT 33h, АХ = 1 — Показать курсор 29
Ввод: АХ = 0001h 29
INT 33h, АХ = 2 — Спрятать курсор 29
Ввод: АХ = 0002h 29
INT 33h, AX = 3 — Определить состояние мыши 29
Ввод: AX = 0000h 29
INT 33h, AX = 0Ch — Установить обработчик событий 29
Ввод: AX = 000Ch 29
1.7. Другие устройства 30
1.1.10. Системный таймер 30
Функция DOS 2Ah — Определить дату 30
Ввод: АН = 2Ah 30
Функция DOS 2Ch — Определить время 30
Ввод: АН = 2Ch 30
Функция DOS 2Bh — Установить дату 30
Ввод: АН = 2Bh 30
Функция DOS 2Dh — Установить время 30
Ввод: АН = 2Dh 30
INT 1Ah, АН — 04h — Определить дату RTC 31
Ввод: АН = 04h 31
INT 1Ah, АН = 02h — Определить время RTC 31
Ввод: АН = 02h 31
INT 1Ah, АН = 05h — Установить дату RTC 31
Ввод: АН = 05h 31
INT 1Ah, АН = 03h — Установить время RTC 31
Ввод: АН = 03h 31
INT 1Ah, АН = 06h — Установить будильник 31
Ввод: АН = 06h 31
INT 1Ah, АН = 07 — Отменить будильник 31
Ввод: АН = 07h 31
INT 1Ah, АН = 00h — Считать значение счетчика времени 32
Ввод: АН = 00h 32
INT 1Ah, АН = 01h — Изменить значение счетчика времени 32
Ввод: АН = 01h 32
INT 15h, АН = 86h — Формирование задержки 32
Ввод: АН = 86h 32
INT 15h, АН = 83h — Запуск счетчика времени 32
Ввод: АН = 83h 32
1.1.11. Последовательный порт 32
Функция DOS 03h — Считать байт из STDAUX 32
Функция DOS 04h — Записать байт в STDAUX 32
INT 14h, АН = 04 — Инициализация FOSSIL-драйвера 33
Ввод: АН = 04h 33
INT 14h, АН = 05h — Деинициализация FOSSIL-драйвера 33
Ввод: АН = 05 33
INT 14h, АН = 00 — Инициализация последовательного порта 33
Ввод: АН = 00h 33
INT 14h, АН =01 — Запись символа в последовательный порт 34
Ввод: АН = 01h 34
INТ 14h, АН = 02 — Чтение символа из последовательного порта с ожиданием 34
INT 14h, АН = 03h — Получить текущее состояние порта 34
Ввод: АН = 03h 34
1.1.12. Параллельный порт 34
Функция DOS 05h — Вывод символа в стандартное устройство PRN 34
INT 17h, АН = 00 — Вывести символ на принтер 34
Ввод: АН = 00h 34
INT 17h, АН = 01 — Выполнить аппаратный сброс принтера 34
Ввод: АН = 01h 34
INT 17h, АН = 02 — Получить состояние принтеров 34
Ввод: АН = 02h 34
1.8. Работа с файлами 35
1.1.13. Создание и открытие файлов 36
Функция DOS 3Ch — Создать файл 36
Ввод: АН = 3Ch 36
Таблица 5. Коды и описания ошибок DOS 38
Функция DOS 3Dh — Открыть существующий файл 38
DS:DX = адрес ASCIZ-строки с полным именем файла 38
Функция DOS 5Bh — Создать новый файл 38
Функция DOS 5Ah — Создать временный файл 39
Функция LFN 6Ch — Создать или открыть файл с длинным именем 39
DS:SI = адрес ASCIZ-строки с именем файла 39
1.1.14. Чтение из файла и запись в файл 40
Функция DOS 3Fh — Чтение из файла или устройства 40
Функция DOS 42h — Переместить указатель чтения/записи 40
Функция DOS 40h — Запись в файл или устройство 40
Функция DOS 68h — Сброс файловых буферов DOS на диск 41
Функция DOS 0Dh — Сброс всех файловых буферов на диск 41
1.1.15. Закрытие и удаление файла 41
Функция DOS 3Eh — Закрыть файл 41
Ввод: АН = 3Eh 41
Функция DOS 41h — Удаление файла 41
Ввод: АН = 41h 41
Функция LFN 41h — Удаление файлов с длинными именами 41
1.1.16. Поиск файлов 42
Функция DOS 1Ah — Установить область DTA 43
Функция DOS 4Fh — Найти следующий файл 44
Функция LFN 4Eh — Найти первый файл с длинным именем 44
Функция LFN 4Fh — Найти следующий файл 44
Функция LFN A1h — Закончить поиск файла 45
Ввод: AX = 71Alh 45
1.1.17. Управление файловой системой 45
Функция DOS 39h — Создать каталог 45
Ввод: АН = 39h 45
Функция LFN 39h — Создать каталог с длинным именем 45
Функция DOS 3Ah — Удалить каталог 45
Ввод: АН = 3Ah 45
Функция LFN 3Ah — Удалить каталог с длинным именем 45
Функция DOS 47h — Определить текущий каталог 45
Функция LFN 47h — Определить текущий каталог с длинным именем 46
Функция DOS 3Bh — Сменить текущий каталог 46
Функция LFN 3Вh — Сменить каталог с длинным именем 46
Функция LFN A0h — Получить информацию о разделе файловой системы VFAT 46
1.9. Управление памятью 46
1.1.18. Обычная память 47
Функция DOS 48h — Выделить память 47
Ввод: АН = 48h 47
Функция DOS 49h — Освободить память 47
Ввод: АН = 49h 47
Процесс может освобождать только те блоки памяти, для которых он является владельцем. 47
Функция DOS 4Ah — Изменить размер блока памяти 47
1.1.19. Область памяти UMВ 48
Функция DOS 58h — Считать/изменить стратегию выделения памяти 48
1.1.20. Область памяти НМА 49
1.1.21. Интерфейс EMS 49
INT 67h, АН = 46h — Получить номер версии 50
Ввод: АН = 46h 50
INT 67h, АН = 41h — Получить сегментный адрес окна 50
Ввод: АН = 41h 50
INT 67h, АН = 42h — Получить объем памяти 50
Ввод: АН = 42h 50
INT 67h, АН = 43h — Выделить идентификатор и EMS-память 50
Ввод: АН = 43h 50
INT 67h, АН = 44h — Отобразить память 50
Ввод: АН = 44h 50
INT 67h, АН = 45h — Освободить идентификатор и EMS-память 50
Ввод: АН = 45h 50
1.1.22. Интерфейс XMS 51
INT 2Fh, AH=43h — XMS- и DPMS-сервисы 51
Ввод: AX = 4300h: проверить наличие XMS 51
Функция XMS 00h — Определить номер версии 51
Функция XMS 08h — Определить объем памяти 51
Функция XMS 88h — Определить объем памяти 51
Функция XMS 09h — Выделить память 51
Ввод: АН = 09h 51
Функция XMS 0Ah — Освободить память 51
Ввод: АН = 0Ah 52
Функция XMS 0Bh — Пересылка данных 52
Ввод: АН = 0Bh 52
Функция XMS 0Fh — Изменить размер XMS-блока 52
1.10. Организация процессов 52
1.1.23. Запуск программ на выполнение 52
Функция DOS 4Bh — Загрузить и выполнить программу 54
+02h: 4 байта — адрес командной строки для нового процесса 55
+0Ah: 4 байта — адрес второго FCB для нового процесса 55
AL = 03h — загрузить как оверлей 55
+00h: слово — сегментный адрес для загрузки оверлея 55
+00h: слово — 00h 55
+08h: слово — сегментный адрес PSP новой программы 55
+0Eh: 4 байта — размер программы, включая PSP 55
Функция DOS 4Ch — Завершить программу 56
Ввод: АН = 4Ch 56
Функция DOS 4Dh — Определить код возврата последнего завершившегося процесса 56
1.1.24. Переменные окружения 56
1.1.25. Командные параметры 56