Изучение принципов обработки аппаратных прерываний, страница 2


Результатом работы программы является выведенный в центр экрана символ *.

Программа 3. Повторите эксперимент без передачи управления. Не забудьте снять заявку в регистре ISR контроллера прерываний.



itimer3.asm


sseg SEGMENT STACK     

      db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

adr_int:

      ipsave dw 0h

      cssave dw 0h     

      msg db '*$'

dseg ENDS

cseg SEGMENT

main proc FAR

      ASSUME      cs:cseg, ds:dseg, ss:sseg

start:

; Data segment init

      mov ax, dseg     

      mov ds, ax

      ; Get handler int8 adress

      mov ax,3508h           

      int 21h

      mov ipsave, bx   

      mov ax, es

      mov cssave, ax   

      push ds

      mov dx, offset int_8

      mov ax, seg int_8

      mov ds, ax       

      ; Set our handler

      mov ah, 25h

      mov al, 8h       

      int 21h                

      pop ds

      mov ax,0h                   

      ; Work with klav

      int 16h

      push ds

      mov dx, ipsave

      mov ax, cssave

      mov ds, ax

      mov ah, 25h

      mov al, 8h

      int 21h

      pop ds

      ; Exit

      mov ah,4Ch       

      int 21h

main  ENDP

int_8 proc FAR              

      push ax                

      push bx

      push es

      push ds

      push di

      mov ax, dseg

      mov ds,ax

      ; Color Display

      mov ax,0B800h    

      mov es,ax

      lea bx, msg

      ; Where to output

      mov di,7D0h

m1:

      mov al,[bx]

      cmp al,'$'

      je m_ex

      mov es:[di],al

      inc di

      inc bx

      mov es:[di],word ptr 0F0h

      inc di

      jmp m1

m_ex:

      pop di                      

      pop ds

      pop es

      pop bx

      pop ax

      ; Unset int flag

      mov al,20h       

      out 20h,al

      iret

int_8 ENDP

cseg ENDS

END start


Результатом работы программы является выведенный в центр экрана символ *.


Программа 4. Замените в обработчике прямое отображение в видеопамять на  процедуру инкрементации счетчика прерываний от таймеры так, чтобы по истечению одной секунды происходил вызов пользовательского прерывания int60h. Перед возвратом из программы обработки int8h передать управление исходному обработчику, чтобы не сбивать системные часы. Для иллюстрации результата в обработчик int60h включить вывод на экран символа.

Интервалу времени 1с соответствует 18 прерываний от таймера. Как только программный счетчик досчитывает до 18, производится вызов прерывания int 60h.


itimer4.asm


sseg SEGMENT STACK          

      db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

      cnt dw 0h

adr_int8:

      ipsave_8 dw 0h         

      cssave_8 dw 0h

adr_int60:

      ipsave_60 dw 0h        

      cssave_60 dw 0h  

      msg db '*$'

dseg ENDS

cseg SEGMENT

main proc FAR

      ASSUME      cs:cseg, ds:dseg, ss:sseg

start:

      ; Data segment init