Доброе утро. Ребят, есть резидентная программа, захватывающая некоторый участок экрана, и записывает его в файл. При выполнении на emu8086, ругается на int27h. Подскажите в чем проблема, почему не работает ?

Код asm:
  1. CSEG segment
  2. assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
  3. org 100h
  4. Begin:
  5. jmp Init ;На метку инициализации
  6. ; Инициализация (подготовка и настройка резидента)
  7. Init:
  8. mov ax,3509h
  9. int 21h ;Получим и сохраним адрес (вектор) 21h прерывания
  10. mov word ptr Int_09h_vect,bx ;Вначале младшее слово (смещение)
  11. mov word ptr Int_09h_vect+2,es ;Затем старшее (сегмент)
  12. mov ax,2509h ;устанавливаем вектор прерывания
  13. mov dx,offset Int_09h_proc
  14. int 21h ;"Повесим" нашу процедуру на 09h прерывание
  15. mov dx,offset Init
  16. int 27h ;Оставим программу резидентной в памяти.
  17. In_memory db 'Мы уже в памяти!!!!$'
  18. Int_09h_proc proc
  19. pushf ; сохраним флаги и регистры
  20. push ax
  21. push bx
  22. push cx
  23. push dx
  24. push es
  25. push ds
  26. in al, 60h ; читать кнопку
  27. cmp al, 42h ; это F5?
  28. jne go_09h ; если нет - на оригинальный обработчик
  29. in al, 61h ; взять значение порта управления клавиатурой
  30. mov ah, al ; сохранить его
  31. or al, 80h ; установить бит разрешения для клавиатуры
  32. out 61h, al ; и вывести его в управляющий порт
  33. xchg ah, al ; извлечь исходное значение порта
  34. out 61h, al ; и записать его обратно
  35. mov al, 20h ; послать сигнал "конец прерывания
  36. out 20h, al ; контроллеру прерываний 8259
  37. mov ax, 0b800h ; в ax - начальный адрес видеопамяти для текстовых режимов
  38. mov es, ax ; оттуда в es, напрямую с es работать нельзя
  39. xor di, di ; обнуляем di
  40. mov si, offset logfile ; в si - адрес массива, в который будем писать символы с экрана
  41. wr: ; начало цикла записи
  42. movsb ; записать данные из ячейки es:[di] в ячейку ds:[si]
  43. inc si ; si++
  44. inc di ; di++
  45. cmp si, 0b800h ; еще не конец массива?
  46. jne wr ; тогда в цикл
  47. mov ah, 3ch ; создание файла
  48. mov cx, 0 ; атрибут файла - доступен для чтения/записи
  49. mov dx, offset filename ; в dx - адрес переменной, в которой лежит имя файла
  50. int 21h ; прерывание
  51. mov bx, ax ; описатель файла сохраним в bx, потом понадобится
  52. mov cx, 0 ; в cx - смещение указателя
  53. mov dx, 0 ; в dx - база указателя
  54. mov al, 2 ; атрибуты открытия файла
  55. mov ah, 42h ; установка указателя для записи в файл
  56. int 21h ; прерывание
  57. mov ah, 40h ; запись в файл
  58. mov dx, offset logfile ; в dx - адрес массива данных, который будем записывать
  59. mov cx, 0b800h ; в cx - объем записяваемых данных
  60. int 21h ; прерывание
  61. mov ah, 3eh ; закрытие файла
  62. int 21h ; прерывание
  63. Go_09h:
  64. pop ds ; восстановим регистры
  65. pop es ;
  66. pop ds ;
  67. pop cx ;
  68. pop bx ;
  69. pop ax ;
  70. popf ;Выровняем стек
  71. jmp dword ptr cs:[Int_09h_vect] ;"Прыгаем" на оригинальный обработчик
  72. iret
  73. Int_09h_vect dd ? ;Здесь хранится адрес оргинального обработчика
  74. filename db 'res.txt', 0 ; имя файла, если не указан путь - создается в директории исполняемого файла
  75. logfile db 0b800h dup (0) ; массив данных для записи
  76. Int_09h_proc endp
  77. CSEG ends
  78. end Begin