Assembler - язык неограниченных возможностей


Прерывания от внешних устройств - часть 3


Посмотрим, как работает перехват прерывания от таймера на следующем примере:

; timer.asm ; демонстрация перехвата прерывания системного таймера: вывод текущего времени ; в левом углу экрана .model tiny .code .186 ; для pusha/popa и сдвигов org 100h start proc near ; сохранить адрес предыдущего обработчика прерывания 1Ch mov ax,351Ch ; АН = 35h, AL = номер прерывания int 21h ; функция DOS: определить адрес обработчика mov word ptr old_int1Ch,bx ; прерывания mov word ptr old_int1Ch+2,es ; (возвращается в ES:BX) ; установить наш обработчик mov ax,251Ch ; АН = 25h, AL = номер прерывания mov dx,offset int1Ch_handler ; DS:DX - адрес обработчика int 21h ; установить обработчик прерывания 1Ch

; здесь размещается собственно программа, например вызов command.com mov ah,1 int 21h ; ожидание нажатия на любую клавишу ; конец программы

; восстановить предыдущий обработчик прерывания 1Ch mov ax,251Ch ; АН = 25h, AL = номер прерывания mov dx,word ptr old_int1Ch+2 mov ds,dx mov dx,word ptr cs:old_int1Ch ; DS:DX - адрес обработчика int 21h

ret

old_int1Ch dd ? ; здесь хранится адрес предыдущего обработчика start_position dw 0 ; позиция на экране, в которую выводится текущее время start endp

; обработчик для прерывания 1Ch ; выводит текущее время в позицию start_position на экране ; (только в текстовом режиме) int1Ch_handler proc far pusha ; обработчик аппаратного прерывания push es ; должен сохранять ВСЕ регистры push ds push cs ; на входе в обработчик известно только pop ds ; значение регистра CS mov ah,02h ; Функция 02h прерывания 1Ah: int 1Ah ; чтение времени из RTC, jc exit_handler ; если часы заняты - в другой раз

; AL = час в BCD-формате call bcd2asc ; преобразовать в ASCII, mov byte ptr output_line[2],ah ; поместить их в mov byte ptr output_line[4],al ; строку output_line

mov al,cl ; CL = минута в BCD-формате call bcd2asc mov byte ptr output_line[10],ah mov byte ptr output_line[12],al

mov al,dh ; DH = секунда в BCD-формате call bcd2asc mov byte ptr output_line[16],ah mov byte ptr output_line[18],al




Начало  Назад  Вперед