Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
14
Добавлен:
01.05.2014
Размер:
47.62 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет

Отчёт по лабораторной работе №7

по дисциплине «Организация и функционирование ЭВМ»

Вариант №10

Проверил:

Выполнил: Юбрин А.Н.

Шин Е.Д.

Санкт-Петербург

2002

1. Цель работы

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

Требуется вместо стандартного 23h прерывания, генерируемое при нажатии клавиш Control+C, сделать выдачу звукового сигнала(печать символа с кодом 07h);

2. Некоторые сведения

Прерывание - это процесс вызова процедур для выполнения некоторой задачи, обычно связанной с обслуживанием некоторых устройств (обработка сигнала таймера, нажатия клавиши и т.д.).

Когда возникает прерывание, процессор прекращает выполнение текущей программы (если ее приоритет ниже) и запоминает в стеке вместе с регистром флагов адрес возврата(CS:IP) - места, с которого будет продолжена прерванная программа. Затем в CS:IP загружается адрес программы обработки прерывания и ей передается управление. Адреса 256 программ обработки прерываний, так называемые векторы прерывания, имеют длину по 4 байта (в первых двух хранится значение IP , во вторых - CS) и хранятся в младших 1024 байтах памяти. Программа обработки прерывания должна заканчиваться инструкцией IRET (возврат из прерывания), по которой из стека восстанавливается адрес возврата и регистр флагов.

Программа обработки прерывания - это отдельная процедура, имеющая структуру:

SUBR_INT PROC FAR

PUSH AX ; сохранение изменяемых регистров

...

<действия по обработке прерывания>

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

...

MOV AL, 20H

OUT 20H,AL

IRET

SUBR_INT ENDP

Две последние строки необходимы для разрешения обработки прерываний с более низкими уровнями, чем только что обработанное.

Программа, использующая новые программы обработки прерываний при своем завершении должна восстанавливать оригинальные векторы прерываний. Функция 35 прерывания 21H возвращает текущее значение вектора прерывания, помещая значение сегмента в ES, а смещение в BX. В этом случае программа должна содержать следующие инструкции:

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

KEEP_CS DW 0 ; для хранения сегмента

KEEP_IP DW 0 ; и смещения прерывания

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

MOV AH, 35H ; функция получения вектора

MOV AL, 1CH ; номер вектора

INT 21H

MOV KEEP_IP, BX ; запоминание смещения

MOV KEEP_CS, ES ; и сегмента

Для установки написанного прерывания в поле векторов прерываний используется функция 25H прерывания 21H, которая устанавливает вектор прерывания на указанный адрес.

PUSH DS

MOV DX, OFFSET ROUT ; смещение для процедуры в DX

MOV AX, SEG ROUT ; сегмент процедуры

MOV DS, AX ; помещаем в DS

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

MOV AL, 60H ; номер вектора

INT 21H ; меняем прерывание

POP DS

В конце программы программы восстанавливается старый вектор прерывания

CLI

PUSH DS

MOV DX, KEEP_IP

MOV AX, KEEP_CS

MOV DS, AX

MOV AH, 25H

MOV AL, 1CH

INT 21H ; восстанавливаем вектор

POP DS

STI

Таблица 2

DATA SEGMENT

EndLine EQU '$'; Символ конца строки

;

KEEP_CS DW 0 ; для хранения сегмента

KEEP_IP DW 0 ; и смещения прерывания

;

line1 DB 'Выполняется сохранение ВП 23Н в осн.прогр-ме',0AH,0DH,Endline;

line2 DB 'Вып-ся установка нового ВП 23Н в осн.прогр-ме',0AH,0DH,Endline;

line3 DB 'Выполняется восст-е ВП 23Н в осн.программе'

cont_l3 DB 0AH,0DH,Endline;

line4 DB 'Выполняется кон.фрагмент осн.программы'

cont_l4 DB 0AH,0DH,Endline;

line5 DB 'Выполн-ся подпрограмма прерывания польз-ля',0AH,0DH,Endline;

line6 DB 07H,Endline;

teststr DB 'Это тестовая стpока повтоpяется 1000 pаз',0AH,0DH,Endline;

sstack DW 64 dup(0) ; Резерв памяти под стек

top_of_st LABEL WORD ; Нач.знач.вершины стека

DATA ENDS

lab6 SEGMENT BYTE PUBLIC

ASSUME CS:lab6,DS:DATA,ES:nothing,SS:nothing

ORG 100H

start: ; mov SP, OFFSET top_of_st ;Нач.уст. стека

mov AX,DATA ;Нач.установка

mov DS,AX ;сегмента данных

JMP begin

;*******************************************

;******* процедуры ****************

;*******************************************

writeStr PROC NEAR

; Вывод строки на экран ($)

; dx - строка

xor ax,ax

mov ah,09H

int 21H

ret

writeStr ENDP

;

;-------------------------------

SUB_INT PROC FAR

PUSH AX ; сохранение изменяемых регистров

PUSH DX ; сохранение изменяемых регистров

; действия по обработке прерывания

; mov dx,offset line5

; call writeStr

; mov dx,OFFSET line6

; call writeStr

mov ax,0200h

mov dx,0007h

int 21h

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

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

; MOV AL, 20H

; OUT 20H,AL

IRET

SUB_INT ENDP

;*******************************************

; Команды основной части программы

;*******************************************

begin :

; Сохранение занимаемого вектора прерывания 60Н

mov dx,OFFSET line1

call writeStr

xor ax,ax

MOV AH, 35H ; функция получения вектора

MOV AL, 23H ; номер вектора

INT 21H

MOV KEEP_IP, BX ; запоминание смещения

MOV KEEP_CS, ES ; и сегмента

;*******************************************

; Установка нового значения вектора прерывания 23Н

;*******************************************

mov dx,OFFSET line2

call writeStr

PUSH DS

MOV DX, OFFSET SUB_INT ; смещение для процедуры прер-я в DX

MOV AX, SEG SUB_INT ; сегмент процедуры прер-я

MOV DS, AX ; помещаем в DS

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

MOV AL, 23H ; номер вектора

INT 21H ; меняем прерывание

POP DS

;*******************************************

mov cx, 1000; Тестирующая часть, выводит 1000 строк, во время вывода, можно нажать Control+C

testl:

mov DX,offset teststr

call writeStr

; int 23h

loop testl

;*******************************************

; -- в конце программы

mov dx,OFFSET line3

call writeStr

CLI

PUSH DS

MOV DX, KEEP_IP

MOV AX, KEEP_CS

MOV DS, AX

MOV AH, 25H

MOV AL, 23H

INT 21H ; восстанавливаем вектор

POP DS

STI

;*******************************************

; Завершение программы

mov dx,OFFSET line4

call writeStr

; mov DX,0300h

; mov cl,4

; shr DX,cl

xor ax,ax

mov ah,4CH

; mov AH,31h

int 21h

lab6 ENDS

END start

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