в памяти, которая на нажатие клавиши "F1" выводила в консоль "Hello World!", и затем восстанавливала прежний обработчик прерываний клавиатуры. Программа запускается, но есть проблемы.
Первый вопрос, почему до строки "Resident installed in memory" выводятся какие-то непонятные символы?
Второй вопрос, почему резидент не реагирует на нажатие клавиши "F1" в консоли? (Клавиатура при этом доступна, можно набирать любые символы)
.model tiny
.stack 100h
.data
InitMsg DB "Resident installed in memory!",13,10,"$"
HelloWorldMsg DB "Hello World!",13,10,"$"
Old_09h DD ? ;определение ячейки памяти для хранения адреса системного обработчика
.code.startup
main:
jmp Init
New_09h:
push ax
in al,60H ;читать ключ
cmp al,3Bh ;Если символ равен F1
je do_pop ;да, активизировать popup
pop ax ;нет, уйти на исходный обработчик
jmp dword ptr cs:Old_09h
do_pop: ;код отработки нажатия клавиши F1
;выводим сообщение "Hello World"
mov ah,09h mov dx,offset HelloWorldMsg
int 21h
in al,61H ;взять значениe порта управления клавиатурой
mov ah,al ;сохранить его
or al,80h ;установить бит разрешения для клавиатуры
out 61H,al ;и вывести его в управляющий порт
xchg ah,al ;извлечь исходное значение порта
out 61H,al ;и записать его обратно
mov al,20H ;послать сигнал "конец прерывания"
out 20H,al ;контроллеру прерываний 8259
iret ;возврат из обработчика прерываний
Init:
;выводим сообщение о загрузке резидента в память
mov ah,09h
mov dx,offset InitMsg
int 21h
;получаем адрес текущего обработчика прерывания в регистрах ES и BX
mov ah,35h
int 21h
mov word ptr Old_09h,bx
mov word ptr Old_09h+2,es
;запись стартового обработчика в вектор прерыаний с номером 9
mov ah,25h
lea dx,New_09h
int 21h
;освобождение памяти, занимаемое блоком окружения
;mov es,word ptr cs:[2Ch] ;Получим сегмент строки окружения mov es,cs:002Ch
mov ah,49h
int 21h
;возврат в DOS, оставшись резидентным
lea dx,Init int 27h
end main
По второму вопросу. Разве можно вызывать DOS из прерывания, особенно аппаратного? Для начала я бы повесил на прерывание что-нибудь более простое, например закрашивать красным левое верхнее поле экрана. И только отладив это, брался за очень нетривиальную задачу вывода надписи.
Стикер
Обсуждают сегодня