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/ |