В общем, у меня задание - переписать 1-ую функцию 21-го прерывания. После первого запуска этого com-овского файла инсталлируем наш обработчик и оставляем резидентно в памяти. Затем, запускаем какое-либо тестовое приложение для демонстрации работы программы(например, ввести символ). Ну а потом, после 2-го запуска com-овского файла наш обработчик деинсталлируется . Дело в том, что в обработчике идет работа через int16h, а мне преподаватель сказал работать непосредственно через буфер клавиатуры(как я понял, берем то, что лежит в голове буфера(а там лежит 2 байта), и младший байт(ASCI-КОД) заносим в AL. После этого сдвигаем голову на 2 байта. Но как все это делается через буфер, принцип работы я не понимаю, если кто поможет переделать, буду признателен. Это тот самый com-файл:
| Код | prg segment para public 'code' assume cs:prg,ss:prg,es:prg,ds:prg org 100h start: jmp go
old_int21_ofset dw ? old_int21_segm dw ? install_data dw 01234h ;
my_int21 proc far cli pushf cmp ah, 01h ; Проверяем была ли вызвана первая функция jne old ; Если нет, то перходим к стандартному обработчику ; Если это первая функция mov ah, 00h int 16h ;именно в этом месте,как я понимаю, как-то должна идти работа с буфером клавиатуры вместо int16h popf sti IRET old: ; Стандартный обработчик pushf call dword ptr cs:[old_int21_ofset] popf sti IRET my_int21 endp
resident_ending: text_installed db 'Resident have installed' ,13,10,'$' text_uninstalled db 'Resident have UNinstalled' ,13,10,'$'
go: mov ah, 35h mov al, 21h int 21h
cmp word ptr es:[bx-2], 01234h ; если тут лежит 01234h, то инсталлируем, если 56789-деинсталлируем je is_installed ; Unistale mov ah,9h lea dx,text_installed int 21h
mov cs:old_int21_segm , es mov cs:old_int21_ofset , bx
mov ah, 25h mov al, 21h lea dx,cs:[my_int21] int 21h mov install_data,56789h ; jmp finish
is_installed: mov ah,9h lea dx,text_uninstalled int 21h
cli mov ah, 25h mov al, 21h mov dx, word ptr es:[bx-6] mov ds, word ptr es:[bx-4] int 21h sti
finish: lea dx, resident_ending int 27h ret prg ends end start
|
А этот файл просто для тестирования обработчика
| Код | prg segment para public 'code' assume cs:prg,ss:prg,es:prg,ds:prg org 100h start: jmp go text1 db 'Please, enter your character' ,13,10,'$' text2 db 10, 13, 'Your character is:' ,13,10,'$'
go: mov ah, 09h lea dx, text1 int 21h
xor ax, ax mov ah, 01h int 21h push ax
mov ah, 09h lea dx, text2 int 21h
pop ax mov ah, 02h mov dl, al int 21h ret prg ends end start
|
|