Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MyStack SEGMENT STACK
- DB 1024 DUP(?) ;Выделение памяти под стэк
- MyStack ENDS
- DATA SEGMENT
- KEEP_CS DW 0 ;Буфер для хранения сегмента
- KEEP_IP DW 0 ;и смещения старого прерывания
- TEXT 07h,'$' ;для вывода сообщения о завершении прерывания
- ;CYCLE_TEXT DB 'Waiting', 0DH, 0AH, '$' ;для вывода сообщений во время прерывания
- DATA ENDS
- CODE SEGMENT
- ASSUME SS:MyStack, DS:DATA, CS:CODE
- MyInt PROC FAR
- ;сохраняем изменяемые регистры:
- push ax ;записываем ax в стек
- push cx ;записываем cx в стек
- push dx ;записываем dx в стек
- mov dx, offset TEXT ;записываем в dx смещение адреса строки
- mov ah, 9 ;выводим сообщение о том, что происходит задержка
- int 21h
- mov cx, 100 ;объявляем счётчик цикла
- cycle1:
- push cx
- mov cx, 1000
- cycle2:
- loop cycle2
- pop cx
- loop cycle1
- mov dx, offset TEXT ;выводим сообщение о том, что прерывание выполнено
- mov ah, 9
- int 21h
- pop dx ;возвращаем регистры в исходное состояние
- pop cx
- pop ax
- mov al, 20h ; Две последние строки необходимы для разрешения обработки прерываний с более низкими уровнями, чем только что обработанное.
- out 20H, al
- iret ;возврат из прерывания
- MyInt ENDP ;конец процедуры
- Main PROC FAR
- push ds ;запоминаем адрес psp
- sub ax, ax
- push ax
- mov ax, data ;получаем адрес DATA SEGMENT
- mov ds, ax ;записываем его в ds
- mov ah, 35h ;функция получения вектора
- mov al, 08h ;номер вектора
- int 21h
- mov KEEP_CS, es ;запоминание смещения
- mov KEEP_IP, bx ;и сегмента
- ;Задание нового обработчика
- push ds
- mov dx, offset MyInt ;смещение для процедуры в DX
- mov ax, seg MyInt ;сегмент процедуры
- mov ds, ax ;помещаем в DS
- mov ah, 25h ;функция установки вектора
- mov al, 08h ;номер вектора
- int 21h ;меняем прерывание
- pop ds
- mov cx, 1000 ;объявляем счётчик цикла
- cycleA:
- push cx
- mov cx, 1000
- cycleB:
- loop cycleB
- pop cx
- loop cycleA
- ;----Восстанавливаем адрес старого обработчика-----
- cli ;Сброс флага прерывания(if = 0).
- push ds
- mov dx, KEEP_IP ;смещение для процедуры в DX
- mov ax, KEEP_CS ;сегмент процедуры
- mov ds, ax ;помещаем в DS
- mov ah, 25h ;функция установки вектора
- mov al, 08h ;номер вектора
- int 21h ;восстанавливаем вектор
- pop ds
- sti ;установка флага прерывания(if = 1)
- ret
- Main ENDP
- CODE ENDS ;Конец сегмента
- END Main ;Конец программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement