Наш обработчик прерывания от будильника
int 1Ah
Ids DX,old_4a/DS:DX=исходный вектор
mov AX,254Ah ;Установим исходный вектор
int 21h
mov AX,4C00h ;Завершим программу
int 21h
main endp
; Наш обработчик прерывания от будильника new_4a proc
push a ;Сохраним все регистры
push DS ;Сохраним еще и
push ES ;сегментные регистры
mov AX ,seg hour ;Настроим DS на наш
mov DX,AX ;сегмент данных
mov AH,02h ;Прочитаем текущее время
int 1Ah ;из часов реального времени
push CX ;Сохраним полученное
push DX ;текущее время
В примере 3-9 используются несколько команд, отсутствующих в МП 86: команды сохранения в стеке и восстановления всех регистров общего назначения pusha и рора, а также команда сдвига shl с числовым операндом. Для того, чтобы эти команды распознавались ассемблером, в программу включена директива .586 (можно было бы обойтись и директивой .386). В этом случае необходимо оба сегмента объявить с описателем use16.
Программа состоит из главной процедуры main, процедуры new_4a обработчика прерываний от будильника, а также трех вспомогательных процедур-подпрограмм add_time, add_unit и conv. Главная процедура сохраняет исходный вектор прерывания 4Ah, устанавливает новый обработчик этого прерывания, читает текущее время и устанавливает будильник на время, отстоящее от текущего на 1 секунду, а затем останавливается в ожидании нажатия любой клавиши. Пока программа стоит, обрабатываются прерывания от будильника и в правый верхний угол экрана каждую секунду выводится текущее время. После нажатия любой клавиши программа завершается, предварительно сбросив будильник и восстановив исходное содержимое вектора 4Ah.
Содержание Назад Вперед