Файл: Системное программирование.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.02.2025

Просмотров: 9024

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Системное программирование

Контрольные вопросы

2. Программная модель микропроцессора 8086

2.1. Представление информации

2.2. Регистры микропроцессора

2.3. Формат машинной команды

2.4. Способы задания операндов команды

Контрольные вопросы

3. Основные понятия языка ассемблера

3.1. Предложения

3.2. Директивы определения данных

3.3. Выражения

Контрольные вопросы

4. Сегментированная модель памяти

4.1. Сегментирование адресов

4.2. Директивы сегментации

4.3. Общая структура программы

4.4. Модели памяти

Контрольные вопросы

5. Основные группы команд

5.1. Соглашению по описанию команд

5.2. Команды пересылки данных

5.3. Арифметические команды

5.4. Логические команды

5.5. Команды переходов

5.6. Команды организации циклов

5.7. Команды обработки строк

5.8. Стековые команды

5.9. Команды ввода-вывода

5.10. Команды прерываний

5.11. Команды управления микропроцессором

Контрольные вопросы

6. Подпрограммы

Контрольные вопросы

7. Разработка одномодульной программы

7.1. Трансляция и компоновка программы

7.2. Отладка программы

Контрольные вопросы

8. Разработка многомодульных программ

8.1. Принципы разработки модулей

8.2. Расширенное применение директивы сегментации

9. Упражнения

Контрольные вопросы

Программирование микропроцессорных устройств

10. Программирование системного таймера

10.1. Описание таймера-счетчика 8254

10.2. Режимы работы таймера

10.3. Структура регистров таймера

10.4. Упражнения

Контрольные вопросы

11. Программирование контроллера прерываний

11.1. Механизм обработки прерываний

11.2. Типы прерываний

11.3. Приоритеты прерываний

11.4. Контроллер прерываний 8259

11.5. Идентификация прерываний

11.6. Прерывания bios и ms-dos

11.7. Упражнения

Контрольные вопросы

12. Программирование параллельного порта

12.1. Интерфейс Centronics

12.2. Работа с параллельным портом на низком уровне

12.3. Стандартные средства работы с параллельным портом

12.4. Упражнения

Контрольные вопросы

13. Программирование последовательного порта

13.1. Основы последовательной передачи данных

13.2. Последовательный интерфейс rs-232c

13.3. Универсальный асинхронный приемо-передатчик 8250

13.4. Порты асинхронного адаптера

13.5. Стандартные средства программирования последовательного порта

13.6. Упражнения

Контрольные вопросы

Литература

141 Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета

Многие из функций MS-DOS осуществляют проверку своего выполнения. При успешном выполнении функции флаг CF равен 0, и 1 в случае возникновения ошибки. В последнем случае код ошибки возвращается в регистр AX. В табл. 94 описаны значения кодов ошибок.

Табл. 94. Коды ошибок при вызовах функций MS-DOS.

Код

Значение

1

Ошибочный номер функции.

2

Файл не найден.

3

Путь к файлу не найден.

4

Слишком много открытых файлов

(не осталось свободных логических номеров).

5

Доступ не разрешен.

6

Ошибочный логический номер файла.

7

Управляющий блок памяти разрушен.

8

Недостаточно памяти.

9

Ошибочный адрес блока памяти.

10

Ошибочная аппаратная среда.

11

Ошибочный формат.

12

Ошибочный код доступа.

13

Ошибочные данные.

14

Ошибочное имя дисковода.

15

Попытка удалить текущую директорию.

16

Неверное устройство.

17

Превышен предел числа файлов.

Функции прерывания 21h предоставляют множество возможностей по взаимодействию с клавиатурой, дисплеем, дисковой системой, последовательным адаптером. Наиболее полезные функции перечислены в табл. 95.


Табл. 95. Функции прерывания 21h.

Регистр

Операция

Дополнительные входные регистры

Выходные регистры

Функции по работе с клавиатурой

1

Ожидание набора символа на клавиатуре и последующее изображение его на экране (с проверкой на Ctrl-Break)

Не используются

AL = символ

6

Чтение символа с клавиатуры (без проверки на Ctrl-Break)

DL = 0FFh

AL = очередной символ, если буфер клавиатуры не пуст;

AL = 0, если буфер клавиатуры пуст

7

Ожидание набора символа на клавиатуре без последующего его изображения (без проверки на Ctrl-Break)

Не используются

AL = символ

8

То же, что функция 7, но с проверкой на Ctrl-Break

Не используются

AL = символ

A

Чтение клавиатурной строки в буфер

DS:DX = Адрес буфера

Первый байт буфера = размер буфера

Второй байт буфера = число фактически прочитанных символов

B

Чтение состояния клавиатуры

Не используются

AL = 0FFh, если клавиатурная строка пуста,

AL = 0, если она содержит хотя бы один символ

C

Очистка буфера клавиатуры и вызов функции для работы с клавиатурой

AL = номер функции для работы с клавиатурой

В соответствии с вызываемой функцией

Функции по работе с дисплеем

2

Изображение символа (с проверкой на Ctrl-Break)

DL = символ

Не используются

5

Печать символа

DL = символ

Не используются

6

Изображение символа (без проверки на Ctrl-Break)

DL = символ

Не используются

9

Изображение строки

DS:DX = адрес строки, которая должна заканчиваться символом $

Не используются

Функции для обмена данными с асинхронным последовательным портом

3

Ожидание ввода символа через асинхронное последовательное устройство

Не используются

AL = символ

4

Вывод символа на асинхронное последовательное устройство

DL = символ

Не используются

Функции управления файлами

D

Сброс текущего дисковода в начальное состояние

Не используются

Не используются

E

Задание нового текущего дисковода

DL = номер дисковода (0 = A, 1 = B, 2 = C)

AL = число дисководов (2 в случае одного дисковода)

2E

Задание режима проверки

DL = 0

AL = 0 для отключения проверки

AL = 1 для включения проверки

Не используются

Функции по работе с датами и временем

2A

Чтение системной даты

Не используются

CX = год (1980-2099)

DH = месяц (1-12)

DL = день (1-31)

2B

Установка системной даты

CX, DX = дата в том же формате, что и для функции 2A

AL = 0, если дата правильная

AL = FF, если дата ошибочная

2C

Чтение системного времени

Не используются

CH = часы (0-23)

CL = минуты (0-59)

DH = секунды (0-59)

DL = сотые доли секунды (0-99)

2D

Установка системного времени

CX, DX = время в том же формате, что и для функции 2C

AL = 0, если время правильное

AL = FF, если время ошибочное

Функции по работе с векторами прерываний

25

Установка вектора прерывания

DS:DX = новое значение вектора

Не используются

35

Чтение вектора прерывания

AL = номер (тип) прерывания

ES:BX = значение вектора

Функции по работе с директориями

39

Создание директории

(команда MKDIR)

DS:DX = адрес ASCIIZ-строки с именем директории

Возможен код ошибки 3 или 5

3A

Удаление директории

(команда RMDIR)

DS:DX = адрес ASCIIZ-строки с именем директории

Возможен код ошибки 3

3B

Смена текущей директории

(команда CHDIR)

DS:DX = адрес ASCIIZ-строки с именем новой директории

47

Чтение имени текущей директории

DL = номер дисковода

(0 = текущий, 1 = А и т.д.)

DS:DI = адрес буфера размером 64 байта

DS:SI = адрес ASCIIZ-строки

Возможен код ошибки 15

Функции расширенного управления файлами

36

Получение сведений о свободном месте на диске

DL = номер дисковода

(0 = текущий, 1 = А и т.д.)

AX = 0FFFFh, если обнаружена ошибка

AX = число секторов в кластере

BX = число свободных кластеров

DX = общее число кластеров

CX = число байтов в секторе

3C

Создание файла

DS:DX = адрес ASCIIZ-строки

CX = атрибут файла

AX = логический номер файла

Возможен код ошибки 3, 4 или 5

3D

Открытие файла

DS:DX = адрес ASCIIZ-строки

AL = 0 при открытии для чтения

AL = 1 при открытии для записи

AL = 2 при открытии для чтения и записи

AX = логический номер файла

Возможен код ошибки 2, 4, 5 или 12

3E

Закрытие логического номера файла

BX = логический номер файла

Возможен код ошибки 6

3F

Чтение файла или ввод данных с устройства

BX = логический номер файла

CX = число считываемых байтов

DS:DX = адрес буфера

AX = число фактически считанных байтов

AX = 0 при попытке чтения за концом файла

Возможен код ошибки 5 или 6

40

Запись в файл или вывод данных на устройство

BX = логический номер файла

CX = число записываемых байтов

DS:DX = адрес буфера

AX = число фактически записанных байтов

Возможен код ошибки 5 или 6

41

Удаление файла

DS:DX = адрес ASCIIZ-строки

Возможен код ошибки 2 или 5

43

Чтение атрибута файла

AL = 0

DS:DX = адрес ASCIIZ-строки с именем файла

CX = атрибут

Возможен код ошибки 2 или 5

43

Установка нового атрибута файла

AL = 1

DS:DX = адрес ASCIIZ-строки с именем файла

CX = атрибут

Возможен код ошибки 2 или 5

54

Чтение режима проверки

Не используются

AL = 0, если проверка выключена

AL = 1, если проверка включена

56

Переименование файла

DS:DX = адрес ASCIIZ-строки со старым именем файла

ES:DI = адрес ASCIIZ-строки с новым именем файла

Возможен код ошибки 3, 5 или 17


11.7. Упражнения

Пример 1. Привести пример блокировки дискового прерывания.

Решение. Для блокировки дискового прерывания необходимо маскировать 6-й разряд регистра маски IMR контроллера прерываний, соответствующий линии IRQ6. После выполнения операций, требующих маскирования дискового прерывания, следует обязательно очистить регистр IMR, иначе обращения к дискам будет невозможно.

MOVAL, 01000000b; маскируем 6-й бит регистра маски

OUT21h,AL; передаем код в регистр маски прерываний

... ; выполнение операций, требующих маскирования прерывания

MOVAL, 0 ; код очистки регистра маски прерываний

OUT21h,AL; передаем код в регистр маски прерываний

Пример 2. Привести пример замены векторы прерывания с помощью функций MS-DOS.

Решение. В практике разработки системных программ часто возникают необходимость дополнения существующего или создания собственного обработчика прерывания. Перед установкой нового вектора прерывания следует получить текущее значение вектора, сохранить его, а затем восстановить перед завершением программы.

Функция 35h прерывания 21h возвращает текущее значение вектора прерывания, помещая адрес сегмента в ES, а смещения в BX. Функция 25h прерывания 21h позволяет установить вектор прерывания на определенный адрес, указанный регистровой парой DS:DX. Заметим также, что обе функции автоматически запрещают аппаратные прерывания на время изменения вектора, поэтому не существует опасности, что может произойти аппаратное прерывание, использующее данный вектор.

В приведенном примере изменяется вектор прерывания клавиатуры 09h. Код завершения подпрограммы обработки прерывания перед инструкцией IRET необходим только для аппаратного прерывания. Для обработчиков, являющихся расширениями существующих прерываний, код завершения не нужен.

; сегмент данных

OldInterruptSegmentDW? ; адрес сегмента заменяемого вектора прерывания

OldInterruptOffsetDW? ; адрес смещения заменяемого вектора прерывания

; в начале программы

MOVAH,35h ; номер функции для получения вектора

MOVAL,09h ; номер запрашиваемого вектора прерывания

INT21h ; выполнение функции получения адреса вектора


MOVOldInterruptOffset,BX; сохранение адреса смещения вектора

MOVOldInterruptSegment,ES; сохранение адреса сегмента вектора

; установка нового прерывания

PUSHDS; сохранение в стеке содержимогоDS

MOVDX,OFFSETRoutine ; помещение в DX смещения процедуры обработки

MOVAX,SEGRoutine ; помещение в AX сегмента процедуры обработки

MOVDS,AX; передаем вDSадрес сегмента

MOVAH,25h ; номер функции для установки вектора

MOVAL,09h ; номер изменяемого вектора

INT21h ; изменение вектора прерывания

POPDS; восстановление из стека прежнего содержимогоDS

; новый обработчик прерывания 9h

RoutinePROCFAR; объявление подпрограммы обработчика как дальней

PUSHA; сохранение регистров в стеке

... ; выполнение кода подпрограммы обработки прерывания

POPA; восстановление регистров

MOVAL,20h ; завершение обработки аппаратного прерывания

OUT20h,AL; передаем код в регистр обслуживания прерывания

IRET; возврат из процедуры обработки прерывания

RoutineENDP; завершение подпрограммы

; восстановление прежнего прерывания

PUSHDS; сохранение в стеке регистра DS

MOVDX,OldInterruptOffset; помещение в DX смещение прежнего вектора

MOVAX,OldInterruptSegment; помещение в AX сегмента прежнего вектора

MOVDS,AX; передаем адрес сегмента в регистр DS

MOVAH,25h ; номер функции для установки вектора

MOVAL,09h ; номер изменяемого вектора

INT21h ; восстановление прежнего вектора

POPDS; восстановление из стека регистра DS

Пример 3. Используя ассемблер TASM, разработать резидентную программу: общую структуру, загрузчик и резидентную часть. Функциональность резидентной части может быть произвольной. Использовать режим работы ассемблера IDEAL. В качестве прерывания использовать программное прерывание от системного таймера 1Ch. Предусмотреть возможность завершения работы резидентной программы по клавишной комбинации «Ctrl+x».

Решение. Изменение строки таблицы векторов прерываний или иначе подмена прерывания дает возможность создания резидентных программ TSR (Terminate and Stay Resident, завершить и оставить резидентным). Такие программы, постоянно расположены в памяти и выполняют работу в фоновом режиме. Примером таких программ могут быть, например, драйвера клавиатуры, дисплея, различных периферийных устройств.