Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 3

mov int call mov

AH,02h lAli

add_time AH,06h

;Чтение текущего времени

;Прибавим I секунду ;Установим будильник на это ; время int lAli ;Остановим программу, чтобы наблюдать прерывания

mov AH.Olh ;Функция ввода с клавиатуры

int 2Ш ;3авершим программу, прибрав за собой

;Сброс будильника

;О5:ОХ=исходный вектор ;Установим исходный вектор

;Завершим программу

mov AH,07h

int lAli

Ids DX,old_4a

mov AX,254Ah

int 21h

mov AX,4COOh

int 21h main endp

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

new_4a proc

;Сохраним все регистры ;Сохраним еще и ;сегментные регистры ;Настроим DS на наш ;сегмент данных ;Прочитаем текущее время ;из часов реального времени ;Сохраним полученное ;тскущее время

pusha

push DS

push ES

mov AX,seg hour

mov DS,AX

mov AH,02h

hit lAli

push CX

push DX

;Преобразуем время из двоично-десятичных упакованных

;чисел в строку символов ASCII

mov AL,CH ;Перенесем часы в AL

call conv ;Преобразуем старшую цифру

mov hour,AH ;в ASCII и сохраним

and CH,OFh ;Вьщелим младшую цифру

add CH,'0' преобразуем в ASCII

mov hour+l.CH . ;и сохраним

mov AL,CL ;Перенесем минуты в AL

call conv ;Преобразуем старшую цифру

mov min,AH ;в ASCII и сохраним

and DL,OFh ;Выделим младшую цифру

add DL,'0' ;Преобразуем в ASCII

mov min+l,CL ;и сохраним

mov AL,DH ;Перенесем секунды в AL

call conv ;Преобразуем старшую цифру

mov sec,AH ;в ASCII и сохраним

и алгоритмы

143

and DH,OFh ;Выделим младшую цифру

add DH,"0' ;Преобразуем в ASCII :

mov sec+l,DH ;и сохраним

;Вьшедем сформированную строку на экран

mov AX,OB800h ;Настроим ES на сегмент

mov ES,AX видеопамяти

mov DI,160-16 ;Смещение к 72-му знакоместу

mov SI,offset 1юиг;О8:81->строка с временем

mov CX,8 ;Цикл по 8 символам

mov AH,14h ;Атрибут красный по синему

eld ;Движение вперед

screen: lodsb ;Очередной символ в AL

stosw ;Символ+атрибут на экран

loop screen ;Цикл

;Сбросим будильник и установим снова на время через 1с

mov AH,07h

hit lAh

; Вернем сохраненное в стеке ;текущее время ;Прибавим 1 секунду ;Установим будильник на ;время через 1 секунду восстановим сохраненные ;ранее сегментные регистры восстановим все регистры ; Выход из обработчика

pop DX

pop CX

call add_time

mov AH,06h

int 1AU

pop ES

pop DS

popa

iret

new_4a endp

;Подпрограмма прибавления 1 секунды к текущему времени. ;В большинстве случаев достаточно увеличить число секунд ;на 1, но в конце минуты надо увеличить на 1 число минут, ;а в конце часа — увеличить на 1 число часов add_time proc ;Прибавим 1 к числу секунд

mov AL,DH ^Перенесем секунды в AL

call add_unit ;Прибавим I

mov DH,AL ;Перенесем назад в DH

jnc ok ;Если CF=0, на выход

;CF=1, прибавим 1 к числу минут

mov AL,CL ;Перенесем минуты в AL

call add_umt ;Прибавим 1

mov CL.AL ;Перенесем назад в CL

jnc ok ;Если CF=0, на выход

;Перенос, прибавим 1 к числу часов

mov AL,CH ;Перенесем часы в AL

call add_imit ;Прибавим 1

mov CH.AL ;Перенесем назад в СН

144