перехват прерываний от клавиатуры в MSDOS

Тема в разделе "WASM.BEGINNERS", создана пользователем red, 22 май 2006.

  1. red

    red New Member

    Публикаций:
    0
    Регистрация:
    21 май 2006
    Сообщения:
    1
    Проблема в том что после вызова старого обработчика, не возвращается управление в новый обработчик, есть подозрение что я не правильно вызываю старый обработчик. но проверить мне это практически нереально. Выяснил что похоже новый обработчик вообще не вызывается, хотя вроде в учебнике Зубкова С.В. вроде так все должно быть.

    Помогитеразобраться плиз. Вот текст программы:
    Код (Text):
    1. TITLE TestCom
    2.  
    3. .model tiny
    4. ; Определение данных
    5. .data
    6. oldhandler dw 0
    7. .code
    8. .186 ; для pusha/popa и сдвигов
    9.  
    10. org 100h
    11.  
    12. MAIN:;Основное тело программы
    13.  
    14. ; Очистка экрана
    15.  MOV AX,0
    16.  INT 10H ;Передача управления в BIOS
    17.  
    18. ; скопировать адрес предыдущего обработчика в переменную oldhandler
    19.  mov ax,3509h ; АН = 35h, AL = номер прерывания
    20.  int 21h ; функция DOS: считать адрес обработчика прерывания
    21.  mov word ptr oldhandler,bx ; возвратить смещение в ВХ
    22.  mov word ptr oldhandler+2,es ; и сегментный адрес в ES,
    23.  
    24. ; установка прерывания
    25.  push DS ; сохраняем DS
    26.  mov DX,OFFSET keyboardhandler ; смещение для процедуры в DX
    27.  ;mov AX,SEG keyboardhandler ; сегмент процедуры
    28.  ;mov DS,AX ; помещаем в DS
    29.  mov AH ,25h ; функция установки вектора
    30.  mov AL,9H ; номер вектора
    31.  int 21h ; меняем прерывание
    32.  pop DS ; восстанавливаем DS
    33.  
    34. jmp THEEND
    35.  
    36. ; Новый обработчик прерывания
    37. keyboardhandler proc far
    38.  ; Вызвать стандартный обработчик прерывания
    39.  pushf
    40.  call oldhandler
    41.  ;popf
    42.  
    43.  push ax
    44.  push dx
    45.  
    46.  ; вывод символа на экран
    47.  mov dl,01h
    48.  mov AH, 02h
    49.  int 21h
    50.  
    51.  pop dx
    52.  pop ax
    53.  
    54. iret
    55. keyboardhandler endp
    56.  
    57. THEEND:
    58. nop
    59. jmp THEEND
    60.  
    61. END MAIN
     
  2. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    Проверь как это выглядит после компиляции. Скорее всего call генерируется как near а тебе надо far, тобиш call far [oldhandler] хотя правильный syntax не помню.

    И поправь oldhandler dw 0 на oldhandler dd 0

    И посмотри под дебуггером куда указывает ss:sp



    P.S. Не пинайте ногами, я только учусь :)
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (Text):
    1. mov word ptr oldhandler,es ; сегментный адрес в ES,
    2. mov word ptr oldhandler+2,bx ; смещение в ВХ




    p.s. меня тоже не пинайте, я вообще не ассемблерщик :)