Иллюстрированный самоучитель по Assembler


         

Наш обработчик прерывания от будильника


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.

Содержание  Назад  Вперед