main:
call dispdate
;сохраняем адрес старого обработчика (прерывание №8, от таймера)
mov ax, 035 by 9
int 021
mov w old_addr, bx
mov w old_addr+2, es
;загружаем адрес нового обработчика (прерывание №8, от таймера)
lea dx, klavIsr
mov ax, 025 by 9
int 021
;ждем нажатия клавиши Esc
wait_esc:
cmp flag, 1
jne wait_esc
;восстанавливаем старый обработчик
lds dx, old_addr
mov ax, 025 by 9
int 021
int 020
;собственный обработчик
klavIsr:
push ax, ds, es
in al, 60h
cmp al, 1
jne ch_time
mov flag, 1
jmp IsrEnd
ch_time:
cmp al, 20
jne IsrEnd
call disptime
IsrEnd:
pop ax, ds, es
;переход на системный обработчик (cs - нужно??..)
cs jmp old_addr
disptime:
;читаем часы
mov al, 4
out 70h, al
in al, 71h
;печатаем часы
print_sm 20, al
print 24, ':'
;читаем минуты
mov al, 2
out 70h, al
in al, 71h
;печатаем минуты
print_sm 26, al
print 30, ':'
;читаем секунды
mov al, 0
out 70h, al
in al, 71h
;печатаем секунды
print_sm 32, al
ret
dispdate:
;читаем день
mov al, 7
out 70h, al
in al, 71h
;печатаем день
print_sm 0, al
print 4, '.'
;читаем месяц
mov al, 8
out 70h, al
in al, 71h
;печатаем месяц
print_sm 6, al
print 10, '.'
;читаем год
mov al, 9
out 70h, al
in al, 71h
;печатаем год
print_sm 12, al
ret
Результаты испытаний:
До нажатия на кнопку t:
После нажатия на кнопку t:
4. Выводы.
В данной лабораторной работе были исследованы возможности обработки аппаратных прерываний в операционных системах DOS и QNX. Были разработаны программы, использующие прерывания от таймера и клавиатуры, была рассмотрена возможность маскирования прерываний. Все требуемые программы были разработаны как на языке C для ОС QNX, так и на языке Assembler ОС DOS.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.