lab5 / report_lr5
.doc
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра МОЭВМ
отчет
по лабораторной работе №5
по дисциплине «Организация ЭВМ и систем»
Тема: «Написание собственного прерывания»
Студент гр. 3303 |
|
|
Преподаватель |
|
|
Санкт-Петербург
2018
Цель работы.
Ознакомиться с устройством прерываний на языке Ассемблера, а затем разработать программу, которая выполняет необходимое прерывание.
Постановка задачи.
Разработать на языке Ассемблер программу, которая выполняет прерывание 4B.
-
4 – 1Ch – прерывание от часов, генерируется автоматически операционной системой 18 раз в секунду;
-
B – выдача звукового сигнала.
Для исключения возможного взаимного влияния системных и пользовательских прерываний рекомендуется отвести в программе под стек не менее 1К байт.
Ход работы.
Была написана программа lab5.asm. Код программы представлен в приложении A. Программа вызывает собственное прерывание от системных часов, вызывающее звуковой сигнал. Далее Программа была перетранслирована и был создан загрузочный модуль.
Программа была успешно протестирована.
Вывод:
В ходе выполнения лабораторной работы были получены основные навыки программирования и произошло первичное ознакомление с устройством прерываний в программах на языке ассемблера, разработана программа, которая выполняет прерывание системных часов с выводом звукового сигнала.
Приложение А
Код программы lab5.asm
AStack SEGMENT STACK ; стек программы
DW 512 DUP(?) ; выделим 1 Кбайт памяти
AStack ENDS
DATA SEGMENT ; сегмент данных
KEEP_CS DW 0 ; для хранения сегмента
KEEP_IP DW 0 ; для смещения прерывания
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA ,SS:AStack
SOUNG PROC FAR ; новое звуковое прерывание от таймера
PUSH AX ; сохранение изменяемых регистров
cli
mov al, 10110110b
mov dx,43h
out dx, al
mov ax,10CFh ; загружаем частоту звука
dec dx
out dx, al ; последовательно загружаем частоту в выходной порт
mov al, ah
out dx, al
add dx,1Fh
in al, dx; включить динамик
or al, 11b
out dx, al
sti
mov cx,0FFFFh; задержку подбирай сам
a1: loop a1
cli
in al, dx; выключить динамик
and al, 11111100b
out dx, al ; загружаем сигнал в порт
sti
;<действия по обработке прерывания>
POP AX ; восстановление регистров
MOV AL, 20H ; востановление системного прерывания от таймера
OUT 20H,AL
IRET
SOUNG ENDP
Main PROC FAR
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AH, 35H ; функция получения вектора
MOV AL, 1CH ; номер вектора
INT 21H
MOV KEEP_IP, BX ; запоминание смещение
MOV KEEP_CS, ES ; запоминаем сегмент
PUSH DS
MOV DX, OFFSET SOUNG ; смещение для процедуры в DX
MOV AX, SEG SOUNG ; сегмент процедуры
MOV DS, AX ; помещаем в DS
MOV AH, 25H ; функция установки вектора
MOV AL, 1CH ; номер вектора
INT 21H ; меняем прерывание
POP DS ;сохраняем сегмент данных
mov ah,08h ; вызов прерывания вызывающего системный таймер
int 21h
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 ; возвращаем прерывание от внешних устройств
RET
Main ENDP
CODE ENDS
END Main