+ Ответить в теме
Показано с 1 по 2 из 2

Тема: EMu 8086 и int27h - несовместимы?

  1. #1
    Jezrien is on a distinguished road
    Регистрация
    01.06.2017
    Возраст
    25
    Сообщений
    1
    Вес репутации
    0

    По умолчанию EMu 8086 и int27h - несовместимы?

    Доброе утро. Ребят, есть резидентная программа, захватывающая некоторый участок экрана, и записывает его в файл. При выполнении на 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

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    system architect somewhere will become famous soon enough somewhere will become famous soon enough Аватар для somewhere
    Регистрация
    31.08.2006
    Адрес
    71 RUS
    Возраст
    35
    Сообщений
    1,837
    Вес репутации
    17

    По умолчанию Re: EMu 8086 и int27h - несовместимы?

    Это прерывание зарезервировано эмулятором. Используйте функцию 31h прерывания INT 21h
    It's a long way to the top if you wanna rock'n'roll

+ Ответить в теме

Похожие темы

  1. [Intel 8086, TASM 2.5] Вычислить значение функции на интервале и записать в массив
    Написал вот так Смотрю под отладчиком и получаю бред. После ADD SI,2 верные значения X и Y превращаются в неверные и перемещаются в конец массива....
    от velfor в разделе Ассемблер

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения