Лекция по разработке TST (курсовая работа) (1075973)
Текст из файла
33
Лекция по разработке TST (курсовая работа)
1. Вектор прерываний 2
2. Резидентные программы 2
3. Структура запускающей программы (2-е части) 2
4. Обработка прерываний в процессоре (программных и аппартных) 3
5. Установка резидента 3
6. Расчет размера резидента 3
7. Запуск части инициализации 3
8. Разбор параметров в основной программе 4
9. Определение и запоминание старого обработчика 4
10. Задание нового обработчика прерывания 4
11. Другой способ запоминания старого и определение нового обработчика прерывания. 4
12. Много обработчиков 5
13. Точки входа в обработчики прерываний и главную программу 5
14. Вызов старого обработчика прерывания 5
15. Связь с резидентной программой из программы 6
16. Контроль наличия резидента в памяти (другие способы) 7
17. Связь с резидентной программой с помощью клавиатуры 7
18. Выгрузка резидента (части выгрузки) 7
19. Освобождение памяти внутри резидента 7
20. Освобождение памяти внешнее из отдельной программы 8
21. Восстановление старых обработчиков 8
22. Память: область PSP, тело резидента и окружение процесса 8
23. Проверка загрузки и выгрузки с помощью утилиты mem.exe 8
24. Обработка прерываний ДОС в резиденте 8
25. Описание данных резидента 9
26. Вывод строк в резидентной программе на экран 9
27. Завершение основной программы при проверке повторной загрузки 9
28. Примеры резидентных программ. 10
1.Вектор прерываний
<far адрес обработчика> |
… |
… |
… |
<far адрес обработчика или блока> |
<far адрес обработчика> |
<системные области > |
<области п/п ДОС и BIOS> |
Пользовательские резидентные программы и драйверы |
Пользовательские программы |
… |
… |
Видеобуфер |
<системные области > |
<Буферы экрана для разных режимов> |
<системные области > |
… |
Идентификационный № ЭВМ (2б) |
HMA – High Memory Area |
Каждый адрес - 4 байта
…
0000:03F – 1024б=4*256 – конец области вектора
0000:0400 – буферы, данные ОС и т.д
B800:0000 – буфер дисплея (видеопамять)
F000:FFFУE – IBM Computer Type
FFFF:FFF0 – конец области HMA
Все остальные детали смотрите в справочниках ДОС – General Memory Map.
2.Резидентные программы
Э
то программы, которые могут работать параллельно с другими программами ДОС (псевдопараллельно). Обращение к этим программам выполняется через прерывания.
3.Структура запускающей программы (2-е части)
Резидентная часть программы |
Временная часть программы, используемая при инициализации резидента |
- работает только при запуске резидента, проверке повторного запуска или при выполнении процедуры выгрузки резидента.
4.Обработка прерываний в процессоре (программных и аппартных)
Прерывания – инициируемый программные процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возобновлением выполнения прерванной программы.
При обработке программных прерываний процессор (CPU) выполняет команду:
INT <номер прерывания>
Он автоматически вычисляет адрес процедуры прерывания на основе номера (№*4) и выполняет фактически команду CALL с запоминанием в стеке точки возврата (CS:IP). Запоминаются также флаги, а регистры общего назначения программист должен сохранять и восстанавливать самостоятельно в основной программе или в собственной процедуре обработки прерываний.
При обработке аппаратных прерываний выполняется все аналогично, только прерывание активизируется с помощью контроллера прерываний и регистра прерываний и масок прерываний.
5.Установка резидента
Для установки резидента используется специальное прерывание ДОС (Terminate and Stay Resident - TSR):
031H – 21H.
Или BOIS прерывание
027Н
Они отличаются способом задания размера памяти резидента ("обрезания") и отдельными свойствами – см. в справочниках:
1- способ( >64kb и старшие версии ДОС):
MOV DX , <размер резидента в параграфах>
MOV AX, 3100H
INT 21H
2-способ:
MOV DX , <адрес конца резидента от PSP>
INT 27H
6.Расчет размера резидента
Для случая с прерыванием 031H – 21H нужно определить в параграфах размер оставляемой памяти. Он определяется для программы:
ORG 100h
Begin: …
…
INIT:
Так:
MOV DX, (INIT – BEGIN + 10fh)/16
100h – размер PSP, а
0Fh – коррекция при деление нацело (16) для округления целого числа параграфов.
7.Запуск части инициализации
BEGIN:
JPM INIT ; это метка начала части инициализации
; Определение данных резидента
8.Разбор параметров в основной программе
Разбор параметров вы освоили в 6-й ЛР. Здесь вкратце:
-
В PSP со смещением 80Н задана длинна командной строки. Если - 0, то параметров в командной строке нет. (CS:80H – 1 байт).
-
Начиная с CS:81H идет строка параметров которые нужно проверять, включая и сброс пробелов. Просмотр идет в цикле.
-
Алгоритм просмотра реализуется в цикле и с учетом строгой и нестрогой последовательности параметров в задании.
9.Определение и запоминание старого обработчика
Для каждого прерывания нужно определить и запомнить адрес старого обработчика прерывания. Это делается для восстановления старого обработчика и, при необходимости, вызова его из собственного обработчика для выполнения стандартных действий (например, при обработке прерывания от клавиатуры).
Адрес обработчика считывается в поле длинной в 4 байта (длинный адрес).
OLD_09 dd ? ; адрес старого обработчика 09h
(поле определяется в пределах резидентной части)
MOV AH, 35h
MOV AL , 09h ; номер обработчика
INT 21h
MOV WORD PTR CS:OLD_09, BX
MOV WORD PTR CS:OLD_09+2, ES
10.Задание нового обработчика прерывания
Для каждого прерывания, которое обслуживает резидент нужно определить новый обработчик прерывания. Это делается с помощью функции 025h-21h.
MOV AH, 25h
MOV AL , 09h ; номер обработчика
LEA DX, NEW_09
INT 21h
Адрес NEW_09 должен быть определен в резидентной части программы (он является смещением), а сегментный адрес берется из регистра DS, поэтому он должен быть обязательно загружен и быть равным CS.
11.Другой способ запоминания старого и определение нового обработчика прерывания.
Можно напрямую, так как все адреса доступны и без прерываний считать и записать адрес прерываний. Рисунок. Текст этой программы:
Запоминание старого обработчика:
MOV AX, 0
PUSH AX
POP ES
MOV BX, WORD PTR ES: 09h*4
MOV WORD PTR CS:OLD_09, BX
MOV BX, WORD PTR ES: 09h*4 + 2
MOV WORD PTR CS:OLD_09+2, BX
И запись нового обработчика:
MOV AX, 0
PUSH AX
POP ES
LEA BX , NEW_09
MOV WORD PTR ES: 09h*4, BX
MOV BX, DS
MOV WORD PTR ES: 09h*4 + 2, BX
12.Много обработчиков
Если в резиденте используется несколько обработчиков, то в отдельных полях нужно запомнить адрес каждого, и для каждого нужно определить процедуру (адрес) его обработки, а резидентной части создать процедуру для его обработки.
Обработчик 1 |
Обработчик 2 |
Обработчик 3 |
… |
вызов 1 из вектора прерываний
вызов 1 из вектора прерываний
Рисунок.
13.Точки входа в обработчики прерываний и главную программу
Различают точку входа в основную программу (процедуру инициализации) и точки входа в обработчики прерываний. Так как процедуры обработки прерываний инициализируются процессором с использованием вектора прерываний, то их точка вызова определяется заносимым в вектор адресом. Отмечу, что завершение процедуры обработки должно выполняться командой IRET, или вызовом без возврата (JMP) старого обработчика прерывания (cм. ниже). Вызов программы инициализации, которая выполняется в обычном режиме, производится так:
BEGIN: …
JMP INIT
; определение полей и процедур обработки резидента
…
INIT: …
; команды и поля части инициализации
<выход из процедуры инициализации с фиксацией резидента>
…
< обычный выход из процедуры инициализации >
…
14.Вызов старого обработчика прерывания
Вызов старого обработчика прерывания может быть выполнен как безусловный переход (JMP), так и как переход с возвратом (CALL). И первом и во втором случае адресом вызова должен быть запомненный в резидентной части адрес старого обработчика (например: OLD_09).
При безусловном переходе:
JMP DWORD PTR CS:[OLD_09]
При переходе с возвратом:
CALL DWORD PTR CS:[OLD_09]
…
IRET
15.Связь с резидентной программой из программы
Связь с резидентной программой может быть выполнена разными способами: посредством специальных или общих прерываний и непосредственным вызовом процедур резидента с предварительным определением адреса из вектора.
Специальные прерывания 2F и 2D. Главная проблема – точно установить, что Вы обращаетесь именно к своей резидентной программе.
Мультиплексорное прерывание 2F:
1. Первоначально необходимо сохранить старый вектор и установить собственный обработчик в резидентном модуле (см. выше)/
2. Далее в резиденте описывается процедура типа:
NEW_2F PROC FAR
CMP AH, 0EEh ; собственный код
JE MY_OBR
JMP OLD_OBR
;
MY_OBR: CMP AL, 1 ; код наличия в памяти
JE M1
; Проверка выгрузки
CMP AL, 2 ; код выгрузки
JNE M2
; команды и данные для выгрузки
…
MOV AL, 0FFh ; сигнал об успешной выгрузке
IRET
; Установка признака наличия в памяти
M1: MOV AL, 0FFh ; по договоренности код информирования о наличия
M2: IRET
; Вызов старого обработчика
OLD_OBR: JMP DWORD PTR CS:[OLD_2F]
..
3. В основной программе для различных действий вызывается свой обработчик:
Для проверки наличия:
MOV AH, 0EEh
MOV AL, 1 ; Проверка наличия
INT 2Fh
CMP AL, 0FFh
JE IMET1 ; переход если резидент в памяти
; код если нет в памяти
Для передачи сигнала выгрузка (если при завершении резидент должен что-то делать):
MOV AH, 0EEh
MOV AL, 2 ; Сигнал выгрузки
INT 2Fh
CMP AL, 0FFh
JE IMET1 ; переход если выгружено
; код если не выгружен
…
Можно выполнять и другие действия для передачи информации резиденту из других программ.
16.Контроль наличия резидента в памяти (другие способы)
Проверка наличия может быть выполнена и другим способом: по адресу резидента проверяем какую-нибудь константу пароль.
…
PASSW DW 626278
INT_09: …
Далее в программе инициализации вычисляем адрес резидента с помощью функции ДОС 35H.
MOV AH, 35h
MOV AL , 09h ; номер обработчика
INT 21h
SUB BX , 2
MOV AX , WORD PTR ES:BX
CMP AX , PASSW
JNE ERR ; метка обработки отсутствия в памяти
17.Связь с резидентной программой с помощью клавиатуры
Для инициации обработки клавиатуры необходимо, основываясь на изложенной выше информации, установить собственный обработчик для прерывания 09H. После обработки и выполнения своих команд, необходимо вызвать старый обработчик прерываний.
По адресу 0417h – находится 2 байта для управляющих клавиш (Ctrl, Alt, Shift и др.),
По адресу 0419h – находится адрес головы циклического буфера (2 байта)
По адресу 041иh – находится адрес головы циклического буфера (2 байта)
По адресу 041Eh (32 - байта) – циклический буфер клавиатуры
На основе этой информации можно установить код введенного символа и признаки нажатия управляющих клавиш.
Кроме того в AL можно прочитать символ или скан код непосредственно из клавиатуры через порт:
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.