бочий файл, встановить покажчик в кінець і допише стільки байт з буфера починаючи спочатку, скільки вкаже їй змінна-лічильник.
mov ah, 40h
mov cl, sch
mov dx, offset bufer
int 21h
Це зроблено для того, щоб при видаленні програми з пам'яті в файл були записані всі скан-коди включаючи команду на видалення. Цей випадок розглянемо нижче. Після того як дані будуть збережені, відновимо використовувалися регістри і передамо управління наступному по ланцюжку оброблювачу клавіатури. h5> Оброблювач мультиплексорного переривання
Процедура new_2fh перехопить переривання 2Fh, і якщо переривання викликано разом з функцією F1h, то залежно від подфункции значення якої знаходиться в AL виконає наступні дії:
1. Якщо подфункция що знаходиться в AL = 00h (код наявності в пам'яті нашого обробника), то наш обробник поверне в AL = FFh і вийде з переривання.
cmp al, 00h
je inst
...
inst: mov al, 0ffh
iret
2. Якщо подфункция що знаходиться в AL = 01h (Команда на видалення з пам'яті обробника), то збережемо використовувані регістри, викличемо процедуру fil (робота цієї процедури була описана вище), а потім звільнимо блоки пам'яті зайняті нашим обробником, відновимо старі вектори 09h і 2Fh. Відновимо використовувалися регістри і вийдемо з переривання.
Якщо мультиплексорне переривання було викликано з іншого функцією або з нашої функцією але з іншими подфункция, то обробник передасть управління наступному по ланцюжку оброблювачу мультиплексорного переривання.
cmp ah, 0f1h
jne out_2fh
cmp al, 00h
je inst
cmp al, 01h
je off
jmp short out_2fh
inst: mov al, 0ffh
iret
out_2fh:
В В В В В В В В В
3.3. Лістинг програми
text segment 'code'
assume cs: text, ds: text
org 256
main proc
jmp init
; Поля даних резидентної секції
old_2fh dd 0; Осередок для збереження системного вектора 2Fh
old_09h dd 0; Осередок для збереження системного вектора 09h
bufer db 34 dup (?); Буфер для скан-кодів і прапорів клавіатури
sch db 0; Лічильник натискань клавіш
filename db 's_code & f.txt', 0; Константа містить ім'я файлу з яким працює програма
; Оброблювач від клавіатури
new_09h proc
; Збережемо використовувані регістри
push ax
push bx
push cx
push dx
push ds
push cs; Набудуємо DS на наш сегмент для простоти програмування
pop ds
in al, 60h; Отримаємо скан-код клавіші
cmp al, 80h; Перевіримо, чи є скан-код кодом натискання
ja exit; Ні - на вихід
mov bh, 0, 0 В® BH
mov bl, sch; Поточне значенн...