Изучение принципов обработки аппаратных прерываний. Логика взаимодействия процессора и контроллера прерываний, страница 3

pop                       es, ds, ax

iret

i08_hnd:

push                      ax, ds, es

mov                      ds, cs                     ;установка доступа к данным процедуры

inc                         cntr                       ;увеличение значения счетчика прерывании

cmp                       cntr, 18                 ;проверка на прохождение 1 минуты (~990 мсек)

jne                         l10

mov                       cntr, 0                   ;обнуление счетчика прерывании

int                         060                       ;вызов пользовательского прерывания

l10:

mov                      al, 020                  ;снятие заявки на обслуживание прерывания

out                        020, al

pop                       es, ds, ax

cs                   jmp                       old_v                    ;передача управления исходному обработчику

Результат – вывод каждую секунду в левый верхний угол экрана символа, каждый раз – с ASCII-кодом, на единицу большим, чем код предыдущего выведенного символа (“*”, далее “+” и т.д.).

2.4.  Изменение программы так, чтобы происходил подсчет относительного времени с момента начала работы программы

Out4.8

include                    mac.inc

jmp                       start

old_v            dd                          ?             ;двойное слово для хранения значения вектора прерывания 08h

old_v1          dd                          ?             ;двойное слово для хранения значения вектора прерывания 060h

cntr                db                          0             ;счетчик прерываний от таймера

sec                 db                          0             ;счетчик секунд

min                db                          0             ;счетчик минут

hour              db                          0             ;счетчик часов

flag                db                          0            

maxmin        db                          2            

start:              chv                        old_v, 08, i08_hnd             ;замена ВП системного таймера

chv                        old_v1, 060, i060_hnd       ;замена пользовательского ВП

l1:

test                        flag        ;проверка на требуемость изменения отображения времени на экране

jz                           l2

mov                      es, 0b800             ;указатель на видеобуфер

mov                      bx, 10                   ;сохранение в стек числа часов, минут и секунд

mov                      cx, 3

mov                      di, 18

mov                      al, hour

mov                      ah, 0

push                      ax

mov                      al, min

mov                      ah, 0

push                      ax

mov                      al, sec

mov                      ah, 0

push                      ax

; цикл преобразования и вывода чч:мм:сс

l3:

pop                       ax                          ;выгрузка из стека и преобразование в ASCII код часов, минут

mov                      dx, 0                      ;секунд и отображение времени на экране в формате чч:мм:сс

div                        bx

add                        dl, '0'

add                        al, '0'

sub                        di, 2                      

cmp                       di, 16

je                           nopt

es                   mov                      b [di], ':'

nopt:

sub                        di, 2

es                   mov                      b [di], dl

sub                        di, 2

es                   mov                      b [di], al

loop                      l3

mov                      flag, 0

l2:

mov                      al, min                  ;проверка на время окончания работы программы

cmp                       al, maxmin           ; в минутах

jne                         l1

restv                     08, old_v              ;восстановление ВП системного таймера