; ------- например
mov ah,4ch
mov al,0 ; код возврата
int 21h
2) Int 20h
; ----- Например
int 20h
3) На этом способе остановимся подробнее - именно он дает возможность программе оставить в памяти свою часть после завершения. Это может быть реализовано 2 способами:
- через int 27h. В этом случае единственный параметр - адрес последнего слова последней целевой процедуры, оставляемой в памяти. Необходимый объем памяти MS DOS вычисляет сама.
;----- пример
Lea dx,StayRes ; В ds:dx нужный адрес
int 27h
- через Fn 31h Int 21h Сервис несколько расширен. Необходимо указать в Ds:dx адрес ( как и в предыдущем примере ) А в al - число параграфов памяти, которые будут выделены под TSR. При этом важно помнить, что параграф занимает 16 байт и проверка на корректность не ведется – т.е. если вы затребуете меньше памяти, чем необходимо - это повлечет за собой крах системы.
ИЗУЧЕНИЕ ПРОБЛЕМЫ РЕЕНТЕРАБЕЛЬНОСТИ В ОПЕРАЦИОННЫХ СИСТЕМАХ
5.1. Цель работы
Понять принципы построения реентерабельных программ и научиться организовывать повторное вхождение в уже запущенную программу.
· Напишите программу, которая по нажатию на ATL+L записывала бы в файл информацию по заданию преподавателя и выгружалась бы после этого. Оформите программу в виде отчета с приведением алгоритма.
· Напишите резидентную программу c преодолением нереентерабельности на языке высокого уровня.
5.3. Понятие реентерабельности
Теперь поговорим о проблемах при написании TSR-программ. Основная из них - нереентерабельность DOS. Реентерабельной (повторно входимой) называется программа или процедура, одна копия которой в памяти может одновременно вызываться несколькими процессами, причем различные выполнения этой процедуры не оказывают влияние друг на друга [6]. В случае же DOS, программист сталкивается с такой ситуацией.
Любая TSR программа должна использовать для своего запуска аппаратное прерывание, которое, вообще говоря, может произойти в любое время, в том числе, и когда выполняется другое (программное) прерывание. Если мы в это время захотим вызвать другое прерывание (программное из своего аппаратного) - это неизбежно приведет к нарушению порядка вызовов прерываний DOS или к переполнению стека и "завесит" систему. Вроде бы решение очевидно - не использовать функции DOS в своих TSR, а использовать для операций ввода / вывода прямой доступ к портам устройств. Однако это на порядок более сложное программирование, да и к тому же очень сильно снижает универсальность программ, потому что протоколы доступа к портам и номера портов могут меняться в зависимости от фирмы производителя и марки конкретного устройства.
К счастью, разработчики DOS оставили пару лазеек для программистов TSR. Одна из этих лазеек состоит в том, что DOS время от времени вызывает прерывание INT 28h, которое, по сути, является "псевдо- реентерабельным", т.е. по умолчанию вызывается, когда DOS ничего не делает и потому реентерабельна. Если мы заменим стандартный обработчик INT 28h на наш, то сможем использовать в нем вызовы прерываний DOS без ущерба для системы.
Другая лазейка состоит в наличии так называемого "Флага активности DOS". Этот флаг имеет конкретный адрес в памяти и может быть проанализирован из TSR-программы (адрес возвращает Fn 34h INT 21h в ES:BX). Если этот флаг отличен от нуля, ОС занята выполнением своего прерывания и потому нереентерабельна.
Самое распространенное заблуждение по поводу реентерабельности состоит в том, что многие считают, что прерывания BIOS реентерабельны. Это неверно в частности по поводу INT 13h (дисковый I/O). Операции с дисками не могут быть реентерабельны по определению, поскольку содержат много критических участков и всегда используют внутренние структуры данных DOS. Все это было сказано к тому, что переход от прерывания INT 21h к INT 13h при работе с файлами ничего не меняет и проблема так и остается проблемой.
5.4. Алгоритм написания TSR программ
Таким образом, мы подошли к обобщению всех методом и приемов по программированию резидентов и теперь сформулируем общий алгоритм построения и разработка TSR программ.
1) Формулируем задачу.
2) Определяем "точки входа" и, исходя из них, выбираем номера прерываний, которые нужно перехватить. При этом учитываем проблему нереентерабельности. Также анализируем целесообразность возвращения управления исходным обработчикам перехваченных нами прерываний.
3) Пишем целевую процедуру (процедуры) с учетом или без учета реентерабельности.
4) Пишем нерезидентную часть, в которой проделываем работы, исходя из необходимости пункта 2. Не забываем о блокировании повторных загрузок программы в память.
Любая программа, будь то простейший пример типа “Hello world” или TSR всегда содержит ошибки, причем, если их нет в исходном тексте программы - значит есть наверняка в самом компиляторе. Под средствами анализа и отладки программ, написанных на языке ассемблер, понимают средства, которые статически или динамически позволяют анализировать ход выполнения программы и изучать ее структуру.
Самым распространенным средством отладки являются специальные программы – отладчики ( debugger ) . Стандартный отладчик debug.com входит в комплект поставки MS DOS , однако ввиду его простоты работать с ним очень сложно. Самым распространенным средством отладки под MS DOS является программа Turbo Debugger. Это средство позволяет работать с резидентами следующим образом. Для отладки резидентных программ необходимо загрузить отлаживаемую программу, запустить ее, найти точку входа, поставить там клавишей F2 точку останова и выбором в меню FILE – RESIDENT оставить отладчик резидентным в памяти, далее произойдет выход в MS DOS и пользователю будет необходимо предпринять действия по активизации резидента. При проходе точки останова управление будет передано отладчику, после чего можно приступать к работе.
Под статическими методами отладки понимают анализ структуры программы дизассемблером - программой, преобразующей код в ассемблерную мнемонику. Основная трудность в этом случае состоит в определении дизассемблером, какие участки программы являются данными, а какие - кодом. В первом случае дизассемблеру необходимо оставить их без изменений, а во втором преобразовать их в ассемблерные мнемоники. Задача такого рода не является тривиальной.
Sourcer v 4.2 by V Communication Inc, IDA v3.43 – примеры дизассемблеров.
ЗАДАНИЕ К КОНТРОЛЬНОЙ РАБОТЕ № 1
· Используя знания, полученные при выполнении лабораторных работ
№№ 1,2,3, выполнить исследования по изучению принципов представления информации на магнитных дисководах.
· Ответить письменно на контрольные вопросы. Номер блока вопросов выбирается по общим правилам.
- Изучить принципы представления информации на накопителях типа магнитных дисков.
- Изучить особенности подготовки их к работе, проверки работоспособности и исправления ошибок.
1. Изучить теоретический материал.
2. Просмотреть каталог диска в сервисной надстройке NORTON COMMANDER и OS SHELL. Создать директорию на винчестере и переписать в нее содержимое гибкого магнитного диска (ГМД).
3. Проверить ГМД утилитой NDD на наличие сбойных блоков и потерянных кластеров. Сформировать файл результата проверки.
4. Утилитой SD добиться минимальной фрагментации файлов. Оценить, изменился ли объем занятой части диска.
5. Отформатировать ГМД в виде системного диска и запустить с него машину.
6. Восстановить на ГМД хранящуюся, на нем ранее информацию.
7. Вновь выполнить пп 2.3., 2.4.
8. Удалить на ГМД несколько файлов и, затем соответствующей утилитой восстановить их.
9. Найти область FAT и просмотреть ее содержимое.
10. Написать отчет о проделанной работе, где кратко привести теоретические сведения и результаты Вашего исследования ГМД.
6.3. Изучение принципов работы с дисковыми накопителями в системе MS DOS
В данной работе будут рассмотрены следующие вопросы, связанные с хранением информации на магнитных дисках:
- какие диски используются в ЭВМ;
- структура диска;
- администратор работы с дисками;
- форматирование и инициализация системного и обычного (рабочего) дисков;
- системные файлы;
- форматеры дисков - утилиты:
SF (из пакета Norton Utilites);
FORMAT (штатный форматер MS DOS);
MAXI
Итак, какие магнитные диски наиболее широко используются в современных ЭВМ для создания энергонезависимых устройств памяти?
Магнитные диски (МД) - представляют собой немагнитный диск, покрытый слоем ферроматериала, способного под действием магнитного поля принимать определенную магнитную ориентацию и затем длительное время сохранять ее. По конструктивному исполнению диски могут быть гибкими и дешевыми или жесткими и дорогими.
Гибкий магнитный диск расположен в защитном пластиковом конверте.
В настоящее время наиболее распространены диски диаметром 3 дюйма. Они имеют жесткий конверт, а также пластину, закрывающую рабочую зону диска и открывающие ее только когда диск находится в дисководе. Этот вариант ГМД имеет емкость 720 Кб или 1.44 Мб (зависит от типа диска).
Существуют также жесткие магнитные диски (ЖМД). ЖМД представляет собой один, а чаще несколько параллельно расположенных, дисков, вращающихся на одной оси и также покрытых ферромагнитным слоем. Эти диски находятся в герметизированном корпусе, чаще в вакууме. Вращаются диски постоянно, после включения питания компьютера. Скорость вращения ЖМД значительно превышает скорость вращения ГМД. Этим и некоторыми другими способами достигается высокая скорость обмена информацией с ЖМД, а также высокая информационная емкость ЖМД (5, 20, 40 ...40000 Мб и выше). ЖМД располагается в корпусе компьютера.