Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MyStack SEGMENT STACK
  2.     DB  1024 DUP(?)                         ;Выделение памяти под стэк
  3. MyStack ENDS
  4.  
  5.  
  6. DATA SEGMENT
  7.     KEEP_CS DW 0                            ;Буфер для хранения сегмента
  8.     KEEP_IP DW 0                                ;и смещения старого прерывания
  9.     TEXT 07h,'$'        ;для вывода сообщения о завершении прерывания
  10.     ;CYCLE_TEXT DB 'Waiting', 0DH, 0AH, '$'         ;для вывода сообщений во время прерывания
  11. DATA ENDS
  12.  
  13.  
  14. CODE SEGMENT
  15.     ASSUME SS:MyStack, DS:DATA, CS:CODE  
  16.  
  17.  
  18. MyInt PROC FAR
  19.                 ;сохраняем изменяемые регистры:
  20.     push ax                  ;записываем ax в стек
  21.     push cx                        ;записываем cx в стек
  22.     push dx             ;записываем dx в стек
  23.  
  24.  
  25.     mov dx, offset TEXT     ;записываем в dx смещение адреса строки
  26.     mov ah, 9               ;выводим сообщение о том, что происходит задержка
  27.     int 21h
  28.                    
  29.     mov cx, 100                ;объявляем счётчик цикла
  30. cycle1:
  31.     push cx
  32.     mov cx, 1000
  33. cycle2:
  34.     loop cycle2
  35.     pop cx
  36.     loop cycle1
  37.  
  38.     mov dx, offset TEXT                 ;выводим сообщение о том, что прерывание выполнено
  39.     mov ah, 9
  40.     int 21h
  41.  
  42.     pop dx                              ;возвращаем регистры в исходное состояние
  43.     pop cx
  44.     pop ax
  45.  
  46.     mov al, 20h     ; Две последние  строки  необходимы для разрешения обработки прерываний с более низкими уровнями, чем только что  обработанное.
  47.     out 20H, al                        
  48.     iret                ;возврат из прерывания
  49. MyInt  ENDP         ;конец процедуры
  50.  
  51.  
  52.  
  53. Main PROC FAR  
  54.     push ds                               ;запоминаем адрес psp
  55.     sub ax, ax
  56.     push ax
  57.  
  58.     mov ax, data                          ;получаем адрес DATA SEGMENT
  59.     mov ds, ax                            ;записываем его в ds
  60.  
  61.     mov ah, 35h                              ;функция получения вектора
  62.     mov al, 08h                              ;номер вектора
  63.     int 21h
  64.  
  65.     mov KEEP_CS, es                          ;запоминание смещения
  66.     mov KEEP_IP, bx                          ;и сегмента
  67.  
  68.     ;Задание нового обработчика
  69.  
  70.     push ds
  71.     mov dx, offset MyInt                      ;смещение для процедуры в DX
  72.     mov ax, seg MyInt                      ;сегмент процедуры
  73.     mov ds, ax                   ;помещаем в DS
  74.     mov ah, 25h                               ;функция установки вектора
  75.     mov al, 08h                               ;номер вектора
  76.     int 21h                                   ;меняем прерывание
  77.     pop ds
  78.  
  79.     mov cx, 1000                     ;объявляем счётчик цикла
  80. cycleA:
  81.     push cx
  82.     mov cx, 1000
  83. cycleB:
  84.     loop cycleB
  85.     pop cx
  86.     loop cycleA
  87.    
  88.  
  89.  
  90. ;----Восстанавливаем адрес старого обработчика-----
  91.     cli                         ;Сброс флага прерывания(if = 0).
  92.     push ds
  93.     mov dx, KEEP_IP             ;смещение для процедуры в DX
  94.     mov ax, KEEP_CS             ;сегмент процедуры
  95.     mov ds, ax                  ;помещаем в DS
  96.     mov ah, 25h                 ;функция установки вектора
  97.     mov al, 08h                 ;номер вектора
  98.     int 21h                     ;восстанавливаем вектор
  99.     pop ds
  100.     sti                         ;установка флага прерывания(if = 1)
  101.     ret
  102. Main ENDP
  103. CODE ENDS                                                         ;Конец сегмента
  104. END Main                                                          ;Конец программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement