Лабораторная работа №71 / lab7 EVM
.docСанкт-Петербургский государственный электротехнический университет
Отчёт по лабораторной работе №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
Вывод: В результате проведенной лабораторной работы, мы освоили способ переопределения и восстановления стандартных прерываний, а также написание и использование собственных прерываний.