mov es:flag,1 ; установка флага - изменение времени
mov ax,word ptr es:sec ; инкрементация счетчика секунд и его сброс
inc ax
cmp ax,60
jne ms
mov ax,0
mov word ptr es:sec,ax
jmp mm
ms:
mov word ptr es:sec,ax
jmp m_ex
mm:
mov ax,word ptr es:min ; инкрементация счетчика минут и его сброс
inc ax
cmp ax,60
jne mm_m
mov ax,0
mov word ptr es:min,ax
jmp mh
mm_m:
mov word ptr es:min,ax
jmp m_ex
mh:
mov ax,word ptr es:hour ; инкрементация счетчика часов и его сброс
inc ax
cmp ax,24
jne mh_h
mov ax,0
mov word ptr es:hour,ax
jmp m_ex
mh_h:
mov word ptr es:hour,ax
m_ex:
pop es
pop ax
mov al,20h ; снятие заявки на обслуживание (ISR)
out 20h,al
iret
myint60 ENDP
cseg ENDS
END work
Результаты работы программы:
В левом верхнем углу экрана мы видим надпись “ НН:MM:SS” розового цвета на синем фоне, SS, MM, HH – время работы программы в часах, минутах, секундах. Программа работает до нажатия клавиши Esc, нажатые за это время другие клавиши сохраняются в буфере клавиатуры, по окончании блокировки они обрабатываются стандартным обработчиком прерывания от клавиатуры. Был изменен обработчик прерывания от клавиатуры. Нажатие клавиши Esc – завершение программы, другая клавиша - стандартный обработчик прерываний от клавиатуры.
2.9. Изменение программы – вывод на экран часов суточного времени.
В начале основной программы следует применить вызов функции 2Ch прерывания DOS 21h - в РОН записывается текущее системное время.
prog9.asm
sseg SEGMENT STACK ; сегмент стека
db 64 dup (?)
sseg ENDS
dseg SEGMENT PARA PUBLIC 'DATA'
cnt dw 0h
sec dw 0h
min dw 0h
hour dw 0h
flag dw 0h
klav dw 0h
adr8i:
ip8 dw 0h ; вектор обработчика
cs8 dw 0h
adr9i:
ip9 dw 0h ; вектор обработчика
cs9 dw 0h
adr60i:
ip60 dw 0h ; вектор обработчика
cs60 dw 0h
msg db ' : : $'
dseg ENDS
cseg SEGMENT
main proc FAR
; связь между регистром сегмента и сегментом программы
ASSUME cs:cseg, ds:dseg, ss:sseg
work: mov ax, dseg ; инициализация сегмента данных dseg
mov ds, ax
; установка вектора прерывания int8
mov ax,3508h ; получение адреса обработчика (вектор прерывания)
int 21h
mov ip8, bx ; сохранение указателей на программу обработки
mov ax, es
mov cs8, ax
; установка вектора прерывания int9
mov ax,3509h ; получение адреса обработчика (вектор прерывания)
int 21h
mov ip9, bx ; сохранение указателей на программу обработки
mov ax, es
mov cs9, ax
; установка вектора прерывания int60
mov ax,3560h ; получение адреса обработчика (вектор прерывания)
int 21h
mov ip60, bx ; сохранение указателей на программу обработки
mov ax, es
mov cs60, ax
push ds
mov dx, offset myint8 ; получение адреса обработчика
mov ax, seg myint8
mov ds, ax
mov ah, 25h ; установка вектора прерывания
mov al, 8h
int 21h
pop ds
push ds
mov dx, offset myint9 ; получение адреса обработчика
mov ax, seg myint9
mov ds, ax
mov ah, 25h ; установка вектора прерывания
mov al, 9h
int 21h
pop ds
push ds
mov dx, offset myint60 ; получение адреса обработчика
mov ax, seg myint60
mov ds, ax
mov ah, 25h ; установка вектора прерывания
mov al, 60h
int 21h
pop ds
mov ah,2ch ; вызов функции 2Ch
int 21h
mov ax,0
mov al,ch
mov hour,ax
mov al,cl
mov min,ax
mov al,dh
mov sec,ax
time: ; цикл, ограничивающий время работы
cmp klav,1 ; проверка нажатия клавиши
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.