Проблема в том что после вызова старого обработчика, не возвращается управление в новый обработчик, есть подозрение что я не правильно вызываю старый обработчик. но проверить мне это практически нереально. Выяснил что похоже новый обработчик вообще не вызывается, хотя вроде в учебнике Зубкова С.В. вроде так все должно быть. Помогитеразобраться плиз. Вот текст программы: Код (Text): TITLE TestCom .model tiny ; Определение данных .data oldhandler dw 0 .code .186 ; для pusha/popa и сдвигов org 100h MAIN:;Основное тело программы ; Очистка экрана MOV AX,0 INT 10H ;Передача управления в BIOS ; скопировать адрес предыдущего обработчика в переменную oldhandler mov ax,3509h ; АН = 35h, AL = номер прерывания int 21h ; функция DOS: считать адрес обработчика прерывания mov word ptr oldhandler,bx ; возвратить смещение в ВХ mov word ptr oldhandler+2,es ; и сегментный адрес в ES, ; установка прерывания push DS ; сохраняем DS mov DX,OFFSET keyboardhandler ; смещение для процедуры в DX ;mov AX,SEG keyboardhandler ; сегмент процедуры ;mov DS,AX ; помещаем в DS mov AH ,25h ; функция установки вектора mov AL,9H ; номер вектора int 21h ; меняем прерывание pop DS ; восстанавливаем DS jmp THEEND ; Новый обработчик прерывания keyboardhandler proc far ; Вызвать стандартный обработчик прерывания pushf call oldhandler ;popf push ax push dx ; вывод символа на экран mov dl,01h mov AH, 02h int 21h pop dx pop ax iret keyboardhandler endp THEEND: nop jmp THEEND END MAIN
Проверь как это выглядит после компиляции. Скорее всего call генерируется как near а тебе надо far, тобиш call far [oldhandler] хотя правильный syntax не помню. И поправь oldhandler dw 0 на oldhandler dd 0 И посмотри под дебуггером куда указывает ss:sp P.S. Не пинайте ногами, я только учусь
Код (Text): mov word ptr oldhandler,es ; сегментный адрес в ES, mov word ptr oldhandler+2,bx ; смещение в ВХ p.s. меня тоже не пинайте, я вообще не ассемблерщик