нажатие клавиши должна реагировать выводом строки, но где-то проваливаюсь в новом отладчике и происходит "повисание" системы.
С чем это может быть связано, помогите пожалуйста
.model tiny.code
ORG 100h
main:
jmp Init
New_09h proc
push ax ;Сохранить регистры в стек
push dx
push ds
push es
mov ax,cs
mov ds,ax
in al,60H ;читать ключ
cmp al,46h ;Если нажата клавиша 'ScrollLock'
je do_pop ;да, активизировать popup
pop es
pop ds
pop dx
pop ax ;нет, уйти на исходный обработчик
jmp dword ptr cs:[Old_09h]
do_pop: ;код отработки нажатия клавиши 'ScrollLock'
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
pushf
call dword ptr cs:[Old_09h]
pop es
pop ds
pop dx
pop ax
iret ;возврат из обработчика прерываний
HelloWorldMsg DB "Hello World!",13,10,"$"
Old_09h DD ? ;определение ячейки памяти для хранения адреса системного обработчика
New_09h endp
Init:
;получаем адрес текущего обработчика прерывания в регистрах ES и BX
mov ah,35h
mov al,09h
int 21h
mov word ptr Old_09h,bx
mov word ptr Old_09h+2,es
;запись стартового обработчика в вектор прерываний
mov ax,2509h
mov dx,offset New_09h
int 21h
;выводим сообщение о загрузке резидента в память
mov ah,09h
mov dx,offset InitMsg
int 21h
;возврат в DOS, оставшись резидентным
mov dx,offset Init
int 27h
InitMsg DB "Resident installed in memory!",13,10,"$"
end main
1. запись стартового обработчика в вектор прерываний mov ax,2509h mov dx,offset New_09h int 21h Мне не нравиться что ты сохраняешь только смещение. А сегмент где? 2. call dword ptr cs:[Old_09h] А тепеь вызываешь по своему сегменту кода а не по ранее сохраненному сегменту
Сегмент в ds, файл .com, cs=ds. А вот call очевидный баг, но не поэтому, а потому что старый обработчки сделает iret (6 байт со стека) вместо ret (2 байта со стека).
Вроде pushf есть и call far тоже
Да, ты прав. Тогда непонятно, что там ещё не так.
Там много странностей. Jmp на старый обработчик и внизу еще и call тудаже😁
Ну это вроде ок, перед джампом все чистится, после call вроде тоже.
Да но логически гепонТно почему в одном случае одно а во втором другое
Обсуждают сегодня