Добрый день, USA-Lesh! Посмотри: http://www.cyberinfo.ru/cgi-bin/view.cgi?id=467&cat_id=6&print=1 Результат дал поиск на AltaVista http://www2.informatik.uni-wuerzburg.de/mitarbeiter/eichelberger/SugiBib/docs/index-files/index-13.html http://www.i3a.org/pdf/wg1n1017.pdf - пожалуй, подробнее всего
Ответ отправлен: 01.07.2003, 10:03 Отправитель: Bill
Вопрос № 294
Hi All. такая значит беда: var IntS : procedure; procedure Int9; interrupt; begin .... IntS; end; begin GetIntVec($9, @IntS); SetIntVec($9, Addr(Int9)); Keep(0); end; что неправильно? какого хрена вылетает рантайм при вызове IntS? строки вида asm move al,20h out 20h,al end; я умышлено опустил, т.к. старый обработчик всёравно это делает. в чём же касяк? а если в Int9 добавляю строки вида: if port[$60] = n then begin SetIntVec($9, @IntS); IntS; Halt(0); end; то может тачка и не виснет, но на клаву точно не реагирует.
Ответ отправлен: 04.07.2003, 09:30 Отправитель: URiS Отвечает Tancho
Здравствуйте, di@ib! Давай твоя прога в Приложение!Тогда будем думать! ------------------------------ procedure Int9; interrupt; begin .... IntS; end; ------------------------------- Это не прога, а какой то кусок! Экспертый не шаманов - они думают на базе конкретные вешчил
Ответ отправлен: 03.07.2003, 09:25 Отправитель: Tancho Отвечает Ayl
Здравствуйте, di@ib! Во-первых, interrupt-процедура должна описываться с модификатором far или с опцией {$F+}. Во-вторых, перед вызовом старого обработчика надо в стеке сохранить флаги, т.к. обработчик завершается по iret. В общем, см. пример в Приложении. Кстати, зачем во втором случае у тебя Halt (0)? Да и в условный оператор нужно добавить ветку else со строчками: asm mov al, 20h out 20h, al end; иначе клава точно повиснет...
Приложение: Ответ отправлен: 03.07.2003, 10:10 Отправитель: Ayl Отвечает Bill
Приветствую Вас, di@ib! Естественно, что ответить точно невозможно, т.к. именно в том, как написана процедура прерывания (Int9), и затыка. Но одно точно - в обработчиках прерываний не следует вызывать другие процедуры(!): обработчик должен работать максимально быстро. Он должен выполнить всю до прихода следующего сигнала. Далее, вызов процедуры не есть вызов обработчика: перед вызовом обработчика сохраняется в стеке программы адрес возврата и состояние флагов процессора, при выходе, естественно, из стека они забираются и восстанавливаются. Вызвав процедуру, Вы положили в стек адрес возврата, а флаги нет. Но при выходе из "правильного" обработчика IntS, их забрали слово (WORD) в качестве флагов. Это может и нет так страшно, если б это слово не было адресом возврата (сегментом кода CS). То есть при выходе Вы окажетесь совсем в другом сегменте,
где Вашей программой и не "пахнет", набор байт процессор попытается выполнить как команды Есть отличная книжка для начинающих К.Г. Финогенов "Самоучитель по системным функциям MS-DOS", М. - 1993 год
Ответ отправлен: 03.07.2003, 10:28 Отправитель: Bill Отвечает _vt
Здравствуйте, di@ib! Рабочий пример установки обработчика int9 есть во встроенной справке Паскаля на ключевое слово keep. Вкратце: 1) перед вызовом старого обработчика у тебя не сохраняются флаги в стеке (asm pushf call ints end; или inline($9c); intS ) 2) в куске твоего кода не вижу директивы {$M xxx, 0, 0}, надеюсь, где-то есть... :-) 3) логику последнего куска не понимаю вообще... :-(
---===*** E-Man 1.2 - Powerful toy***===---
Ответ отправлен: 04.07.2003, 20:40 Отправитель: _vt
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.