Здравствуйте уважаемые программисты.
Пишу с просьбой объяснить, как работает резидентная программа.
Программа является резидентной и выдает сообщение на экран в определенные промежутки времени. Когда сообщение пропадает, программа возвращает информацию на экране в прежнее состояние. Программа реально рабочая.
Помогите ,пожалуйста. Собственными силами не могу разобраться.((
Код программы:
.286
.model tiny
.code
Org 100h
Start:
jmp Install
NewInt1C proc
pusha
push ds es
cmp cs:cnt, 0
jne @@exit
mov cs:cnt, 54
cmp cs:flg, 0
jne @@restore
mov cs:flg, 1
write:
push cs
pop es
mov ax, 0b800h
mov ds, ax
lea di, mem
xor si, si
mov cx, 40
rep movsw
push ds
push es
pop ds
pop es
xor di, di
lea si, string
mov ah, 0eh
cyc:
lodsb
stosw
or al, al
jnz cyc
jmp @@exit
@@restore:
mov cs:flg, 0
mov ax, 0b800h
mov es, ax
push cs
pop ds
lea si, mem
xor di, di
mov al, byte ptr cs:string
cmp al, es:[di]
jne @@exit
mov cx, 40
rep movsw
@@exit:
dec cs:cnt
pop es ds
popa
iret
NewInt1C endp
cnt dw 0
flg db 0
string db 'Hello!',0
mem db 80 dup(0)
Install:
mov ax, 251Ch
lea dx, NewInt1C
int 21h
lea dx, Install
int 27h
ends
end Start
Вопросы:
1. Как я понял перед прерыванием 21h в ah заносится 25, в al заносится 1с. Таким образом вводится вектор прерывания от таймера. Я правильно понял? Если так, то откуда таймер узнает в какой именно момент времени необходимо передать управление процедуре NewInT1C?
2. В какой именно строчке (процедуре) происходит вывод сообщения на экран? Я правильно понял, что тут используется адрес, отвечающий за видеопамять b800?
3. Программа перед выводом сообщения на экран сохраняет то, что на нем было. Где в коде программы это описывается?
4. Зачем нужны переменные flg и cnt? за что они отвечают?
Просто реально программы слишком сложна и мутно (или гениально) написана!