OSDev

для всех
Текущее время: 27 апр 2024, 23:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Переопределить Int09 под Freedos/qemu
СообщениеДобавлено: 14 ноя 2007, 15:32 

Зарегистрирован: 14 ноя 2007, 12:38
Сообщения: 12
Почему эта программа вешает FreeDOS/QEMU?*Переопределяется вектор INT09, обработчик которого делает JMP FAR (0xEA) на стандартный обработчик, который должен корректно завершать обработку (сбросом соотв. флажков контроллера прерываний).*Сразу же восстанавливается адрес обработчика.test.asm:
Код:
        org 100h
        jmp lmain

      ; INT 09h (IRQ1) event handler
eh09:
        push ax
        in al,60h; get scan code
        cmp al,01h
        pop ax
        db 0eah; jmp far old event handler
a09_old resd 1

lmain:
        mov ax,3509h; get old vector
        int 21h
        mov [a09_old],bx
        mov [a09_old+2],es; es:bx
        mov dx,eh09; ds:dx
        mov ax,2509h; set new vector
        int 21h

        mov dx,[a09_old+2]
        mov ds,dx
        mov dx,[a09_old]
        mov ax,2509h; restore vector
        int 21h

        mov ah,4ch; quit
        int 21h


yasm -f bin -w -o test.com test.asm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переопределить Int09 под Freedos/qemu
СообщениеДобавлено: 14 ноя 2007, 15:46 

Зарегистрирован: 14 ноя 2007, 12:38
Сообщения: 12
Вот эта программа также завешивает FreeDOS/QEMU:

Код:
org 100h
jmp start

eh09:
  push ax
  in al,21h
  or al,1
  out 21h,al
  popax
  iret

start:
  cli
  xor ax,ax
  mov es,ax
  lea ax,eh09
  mov es:[09h*4],ax
  mov ax,cs
  mov es:[09h*4+2],ax
  sti
  mov ah,4ch
  int 21h


Почему?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переопределить Int09 под Freedos/qemu
СообщениеДобавлено: 14 ноя 2007, 17:49 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Вторая зависнуть просто обязана: прерывания от клавиатуры блокируются при приходе первого такого прерывания, а само прерывание с точки зрения контроллера остаётся незавершённым (EOI ему не выдаётся).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переопределить Int09 под Freedos/qemu
СообщениеДобавлено: 14 ноя 2007, 22:12 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Да и выход без восстановления вектора приведет к зависанию. Такие программы нужно делать резидентными. Кстати код обработчика вообще весьма странный - маскируется IRQ0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переопределить Int09 под Freedos/qemu
СообщениеДобавлено: 14 ноя 2007, 22:27 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
В первой программе ты запарываешь регистр ds вот в этом фрагменте:
Код:
       mov dx,[a09_old+2]
       mov ds,dx
       mov dx,[a09_old]; ds уже не содержит сегментный адрес программы!!!
       mov ax,2509h; restore vector
       int 21h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переопределить Int09 под Freedos/qemu
СообщениеДобавлено: 14 ноя 2007, 22:40 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Phantom-84

Собственно, во второй программе я IRQ0 и имел в виду, просто по инерции помянул клаву (IRQ1), потому что в первой программе к ней обращение было :)

А в первой -- да, запарывается сегментный регистр. Программа, надо полагать, завершится всё же корректно, но вектор будет восстановлен неверно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB