невозможен. С чем это может быть связано?
Также вопрос, как отправить EOI (End Of Interrupt) на ASM и необходимо ли вообще это в новом обработчике прерываний? (outp(0x20, 0x20))
.model tiny
.stack 100h
.data
msg DB "Resident installed in memory!",13,10,"$"
HelloWorldMsg DB "Hello World!",13,10,"$"
Old_09h dd 0
.code.startup
Init:
;функция для вывода сообщения о загрузке резидента в память
mov ah,09h
mov dx,offset msg
int 21h
;сохраняем прежний вектор прерывания в регистрах bx и es, а затем в поле OLD
mov ax,3509h
int 21h
mov word ptr [Old_09h],bx
mov word ptr [Old_09h+2],es
;запись стартового адреса обработчика в вектор прерываний с номером 9
mov ax,2509h
lea dx,New_09h
int 21h
lea dx,Init
int 27h
New_09h:
cmp al, "a" ; Проверка на нажатие клавиши "A" jne StandartHandler ; Пропустить вывод, если клавиша "A" не нажата
mov ah,09h ; Функция DOS для вывода строки
mov dx,offset HelloWorldMsg ; Указатель на строку с сообщением "Hello World!"
int 21h
jmp StandartHandler
StandartHandler:
jmp dword ptr cs:Old_09h ; Переход к оригинальному обработчику прерывания
end
Стикер
Перед тем, как стать резидентом надо освободить "лишнюю" память.
Обсуждают сегодня