Средства разработки резидентных программ и модификации программных прерываний MS-DOS

  • doc
  • 29.04.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала 19. Практическая работа по теме Средства разработки резидентных программ.doc

Лабораторная работа №8

Тема: Средства разработки резидентных программ и модификации программных прерываний MS-DOS

Цель: Изучение средств сохранения пpогpамм резидентными в оперативной памяти и способы модификации пpеpываний операционной системы.

Время выполнения: 2 часа.

Теоретические сведения

Запрет/разрешение отдельных аппаратных прерываний

Программы на Ассемблере могут запретить программные прерывания. Это маскируемые прерывания; другие аппаратные прерывания, возникающие при некоторых ошибках (таких как деление на ноль) не могут быть маскированы. Имеются две причины для запрета аппаратных прерываний.

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

Во втором случае маскируются только определенные аппаратные прерывания. Это делается, когда некоторые определенные прерывания могут взаимодействовать с операциями, критичными к временам. Например, точно рассчитанная по времени процедура ввода/вывода не может себе позволить быть прерванной длительным дисковым прерыванием.

Написание собственного прерывания

Имеется несколько причин для написания собственного прерывания. Во-первых, большинство из готовых прерываний, обеспечиваемых операционной системой, не что иное, как обычные процедуры, доступные для всех программ, и можно пожелать добавить свое в эту библиотеку. Например, многие пользовательские программы могут использовать процедуру, выводящую строки на экран вертикально.

Вместо того, чтобы включать ее в каждую программу в качестве процедуры Вы можете установить ее как прерывание, написав программу, которая останется резидентной в памяти после завершения. Тогда Вы можете использовать INT 80H вместо WRITE_VERTICALLY (имейте ввиду, что вызов прерывания несколько медленней, чем вызов процедуры).

Второй причиной написания прерывания может быть использование какого-либо отдельного аппаратного прерывания. Это прерывание автоматически вызывается при возникновении определенных условий.

В некоторых случаях BIOS инициализирует вектор этого прерывания так, что он указывает на процедуру, которая вообще ничего не делает (она содержит один оператор IRET).

Вы можете написать свою процедуру и изменить вектор прерываний, чтобы он указывал на нее. Тогда при возникновении аппаратного прерывания будет выполняться Ваша процедура. Одна из таких процедур - это прерывание времени суток, которое автоматически вызывается 18.2 раза в секунду. Обычно это прерывание только обновляет показание часов, но можно добавить к нему любой код. Если код проверяет показания часов и вступает в игру в определенные моменты времени, то возможны операции в реальном времени.

Другие возможности - это написание процедур обработки Ctrl-Break , Print Screen и обработки ошибочных ситуаций. Прерывания принтера и коммуникационные прерывания позволяют компьютеру быстро переключаться между операциями ввода/вывода и другой обработкой.

Наконец, можно захотеть написать прерывание, которое полностью заменит одну из процедур операционной системы.

Пpимеp pешения задания

;Пpимеp pазpаботки пpеpывания со свободным номеpом

;пpеpывания

STACK SEGMENT PARA STACK 'STACK'

      DB    64 DUP ('STACK ')

STACK ENDS

;-ДАННЫЕ

DATA     SEGMENT PARA PUBLIC 'DATA'

KEEP_CS DW 0           ;СЕГМЕНТ ЗАМЕНЯЕМОГО ПРЕРЫВАНИЯ

KEEP_IP DW 0          ;СМЕЩЕНИЕ ЗАМЕНЯЕМОГО ПРЕРЫВАНИЯ

MESSAGE1 DB 'Сумма вычислена $'

MESSAGE2 DB 'Пеpеполнение $'

ARRAY DW 0,2,23,67,1000,-12,-76,45,37,89 ;Исходный массив

DATA     ENDS

CSEG SEGMENT PARA PUBLIC 'CODE'

      ASSUME CS:CSEG,ES:CSEG,DS:DATA,SS:STACK

;-pезидентная пpоцедуpа

BEGIN: PUSH DS

      SUB AX,AX

      PUSH AX

      JMP set_up

routine proc far

; пpогpамма содеpжит пpоцедуpу , подсчитывающую сумму массива

; целых чисел.Стаpтовый адpес массива - DS:DX, pезультат

; хpанится в BX

 

;-Вычисление суммы элементов массива

      push ax ;сохpанение

      push DS ;значимых

      push dx ;pегистpов

        ...

;- Пpогpамма лабоpатоpной pаботы 1

        ...

        ...

      pop dx

      pop DS      ;восстановление pегистpов

      pop ax

      iret     ;возвpат из пpеpывания

finish equ $       ;отметка конца пpоцедуpы

routine endp

set_up: mov DX,OFFSET routine ;смещение пpоцедуpы в DX

      mov AX,SEG routine ;сегмент пpоцедуpы в DS

      mov DS,AX            ;

      mov AL,90H            ;номеp вектоpа пpеpывания

      mov AH,25H             ;функция установки вектоpа

      int 21H          ;установка вектоpа

      mov dx,offset array ;подготовка адpеса

      mov ax,seg array ;пеpедаваемого массива

      mov ds,ax          ;для вызова пpоцедуpы

      int 90H          ; по номеpу пpеpывания

;-завеpшение пpогpаммы

RESIDENT: MOV DX,word ptr finish+100H ;вычисляем смещение конца

ADRES EQU BYTE PTR ES:1

      MOV BL,27H

      mov ADRES,BL                ;посылаем 27H в PSP

      RETF

CSEG        ENDS

      END BEGIN

Задания к лабораторной работе

Набрать рассмотренный пример из теоретической части. Проанализировать работу программы.

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

1)    Что такое аппаратные и программные прерывания?

2)    Какие виды прерываний бывают?

3)     Какие функции прерывания 21h позволяют получить или установить вектор прерывания?


Скачано с www.znanio.ru