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


Пример 3-9. Чтение и обработка показаний часов реального времени - часть 2


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.




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



Книжный магазин