ристувача і які кнопки він після цього натискав. p>
Дана програма працює тільки в середовищі MS-DOS. В В В В В В В В В В
3.2 Опис для програміста
Програма пишеться у форматі СОМ, тому в ній передбачається тільки один сегмент, з якому зв'язуються сегментні регістри CS і DS; на початку сегмента резервується 256 байт дня PSP.
Ініціалізація.
При запуску програми з клавіатури управління передається (відповідно до параметром директиви end) на початок процедури main. Командою jmp відразу ж здійснюється перехід на секцію ініціалізації, яка оформлена у вигляді окремої процедури. У секції ініціалізації готуються умови для роботи програми вже в резидентном стані.
У початковій частині ініціалізації ми перевіряємо наявність хвоста в PSP, якщо ж у командному рядку крім імені команди нічого не було - переходимо на подальший аналіз:
mov cl, es: 80h
cmp cl, 0
je live
Якщо хвіст присутній, перевіримо чи не був введений очікуваний параметр "off". При позитивному результаті перевірки встановлюємо прапор вимоги вивантаження "flag" в одиницю і переходимо на подальший аналіз.
Потім викликаємо мультиплікувавши переривання int2Fh c функцією F1h і подфункцией перевірки на повторну установку 00h. Якщо наш обробник знаходиться в оперативній пам'яті - він поверне AL = FFH, і програма перейде на мітку installed. Перевіримо чи встановлений прапор вимоги вивантаження "Flag". Якщо flag = 1 перейдемо на мітку unins, де перешлемо в першу (резидентну) копію програми запит на вивантаження з оперативної пам'яті за коштами переривання int2Fh і функцією F2h з підфункції 01h. Після чого відбувається виведення рядка "Program is DIE" на екран сигналізує про успішному видаленні резидентної частини програми. Після чого вийдемо з програми, звичайним чином, функцією 4С00h. p> Якщо прапор вимоги вивантаження "flag" = 0, це говорить про те, що введена невідома команда, а наш резидент вже інстальований. У цьому випадку виведемо на екран попереджувальний напис про неможливість повторної установки програми "Program already installed" супроводжувану звуковим сигналом. Після цього завершимо програму функцією 4Ch з кодом повернення 01h. p> Якщо після переривання int2Fh c функцією F200h, повернутися AL В№ FFh, то нашого обробника в пам'яті не виявилося. Збережемо зсуву і сегменти системних обробників int09h і int2Fh, а потім заповнимо вектори зміщеннями наших обробників. p> mov ax, 352fh
int 21h
mov word ptr cs: old_2fh, bx
mov word ptr cs: old_2fh +2, es
mov ax, 252fh
mov dx, offset new_2fh
int 21h
mov ax, 3509h
int 21h
mov word ptr cs: old_09h, bx
mov word ptr cs: old_09h +2, es
mov ax, 2509h
mov dx, offset new_09h
int 21h
Після цього зробимо пошук робочого файлу В«s_code & f.txtВ» в поточному каталозі. Якщо фай...