OSDev
http://osdev.su/

Переопределить Int09 под Freedos/qemu
http://osdev.su/viewtopic.php?f=18&t=168
Страница 1 из 1

Автор:  pacify [ 14 ноя 2007, 15:32 ]
Заголовок сообщения:  Переопределить Int09 под Freedos/qemu

Почему эта программа вешает 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

Автор:  pacify [ 14 ноя 2007, 15:46 ]
Заголовок сообщения:  Re: Переопределить Int09 под Freedos/qemu

Вот эта программа также завешивает 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


Почему?

Автор:  SII [ 14 ноя 2007, 17:49 ]
Заголовок сообщения:  Re: Переопределить Int09 под Freedos/qemu

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

Автор:  phantom-84 [ 14 ноя 2007, 22:12 ]
Заголовок сообщения:  Re: Переопределить Int09 под Freedos/qemu

Да и выход без восстановления вектора приведет к зависанию. Такие программы нужно делать резидентными. Кстати код обработчика вообще весьма странный - маскируется IRQ0.

Автор:  phantom-84 [ 14 ноя 2007, 22:27 ]
Заголовок сообщения:  Re: Переопределить Int09 под Freedos/qemu

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

Автор:  SII [ 14 ноя 2007, 22:40 ]
Заголовок сообщения:  Re: Переопределить Int09 под Freedos/qemu

Phantom-84

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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/