![]() |
|
|
![]()
|
|
| JAPH |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Привожу программку, которая умудряется перевести процессор в защищённый режим, вывести на экран энное количество восклицательных знаков, перевестись обратно в реальный режим и корректно передать управление обратно DOSу.
Так вот. Хочется раскомментировать строку ;sti, чтоб в PM обрабатывать прерывания таймера и клавиатуры (для начала по векторам 8 и 9). Но все мои попытки как-то это организовать проваливались. Даже такой безобидный вариант: в IDT заменить 8 и 9 шлюзы прерываний на нечто, указывающее на код (в сегменте codes)
Так как повела себя прога: не дойдя до вывода восклицательных знаков, прошла шаги 4, 5, 6 (в смысле, показала эти цифры) и перезагрузила комп (вероятно, из-за sti). Что это было? Что сделала iret? iretd тоже не помогла - перезагрузка и всё тут. Как правильно? Если убрать первые две строки в обработчике, прога отрабатывает и даже передаёт управление DOS, но клавиатура в результате просто игнорируется. Итак, просьба-вопрос: написать простейший обработчик прерываний 8 и 9 (желательно использовать шлюзы прерываний), так, чтобы: прерывание 8 не выполняло никакой полезной работы - пример пустого обработчика; прерывнаие 9 выводило по адресу dword ptr 000B80A0h (через fs) scan-код клавиши-причины прерывания в hex-виде. Хочется увидеть полный код. -------------------- Что непонятно - спрашиваем |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
эх, написал бы, но только на GAS
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Напишите, объясните отличия от TASM, может, уловлю и синтаксис, и идеи.
А если не уловлю, наверняка найдётся кто-нибудь, способный перевести код на TASM. Это сообщение отредактировал(а) JAPH - 4.2.2007, 20:17 -------------------- Что непонятно - спрашиваем |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
Это сообщение отредактировал(а) MAKCim - 5.2.2007, 11:19 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Пытаюсь что-нибудь понять...
Вопросы такие: 1. Можно код обратного перепрограммирования контроллера прерываний? То же самое, только в строках 22-25
так? (Задно проверяйте понимание синтаксиса) 2. Почему в строке 19 именно 15h, а не 11h, как у Пирогова? Что есть остальное? Как контроллер отличает различные ICW/OCW, или они посылаются в определённом порядке, тогда в каком? Может, поясните именно этот пример, описание самих CW у меня есть, но связей между ними - нет. 3. Можно ли обойтись без перепрограммирования, то есть можно ли различить, прерывание 8 вызвано из-за таймера или двойной ошибки? По младшему биту кода ошибки? Хотя прерывание таймера не помещает код ошибки в стэк, не должно, так ведь? Может, пользоваться шлюзом задачи и отслеживать ESP - есть код ошибки или нет? 4. В 17ой строке опечатка? -------------------- Что непонятно - спрашиваем |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
отвечу с конца
4. нет, не опечатка, просто в пределах 1-го мегабайта память в пространстве адресов между 0x500 и 0x9FBFF свободна (нет данных BIOS и пр.), поэтому и отводим под стек 512 байт от 0x90200 до 0x90000 (так как мы используем flat 32-х разрядный сегмент данных с базой 0 и лимитом 0xFFFFFFFF) 3. Код ошибки помещается в стек только для исключений. Это раз. Во-вторых обработчик исключения вызывается через шлюз ловушки, в то время как обработчики аппаратных прерываний - через шлюзы прерываний (автоматический вызов cli после записи EFLAGS). Я точно не уверен, будет ли #GP, если их подменить (т. е прерывания обрабатывать через шлюз ловушки)
как вариант, только не шлюзом задачи, а TSS сегментом
(надеюсь, написал правильно, если не забыл tasm) но как видишь, код будет излишне длинным (т. е сам обработчик будет выполняться через хз сколько команд), что неприемлемо для обработчиков прерываний/исключений при этом у тебя также должен быть валидный дескриптор TSS в GDT и TSS сегмент 2. 15h = 00010101b 11h = 00010001b 2-ой бит - размер вектора прерывания если он - 1 => размер 4 байта, иначе - 8 байт да, они посылаются в определенном порядке ICW1 -> ICW2 -> [ICW3] -> [ICW4]
ну так, только опять же, зачем так делать? Это сообщение отредактировал(а) MAKCim - 5.2.2007, 11:22 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Ну, как это зачем? Когда прога выйдет из PM, она должна корректно передать управление DOS. А тут по первому прерыванию от таймера INT 20h!
Насчёт #GP при подмене шлюза прерывания на ловушки - судя по тому, что они отличаются друг от друга только разрешением/запретом прерываний во время работы обработчика, не будет. По поводу стэка - получается, что никто не контролирует, выйдем мы за 512 байт или нет. Вот я и удивился. По поводу Я читал, что IDT может содержать только шлюзы прерываний, ловушек и задач. А что на самом деле? -------------------- Что непонятно - спрашиваем |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
а, ну если в этом смысле, тогда да
ну это же пример, думаю 512 байт вполне достаточно, нет - пожалуйста, делай отдельный дескриптор для стека и пр.
так оно и есть просто если тебе надо узнать, произошло исключение или прерывание, то нужно узнать ESP для CPL = 0, а он находится в TSS текущей задачи -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Прицепил перепрограммирование контроллера до и после. Теперь проблема такая: после возврата в DOS набрать что-либо в командной строке не удаётся - клавиатура игнорируется. Причём раскомментирование sti и/или комментирование mov al, 20h | out 20h, al исхода не меняет. Чего я недоглядел?
-------------------- Что непонятно - спрашиваем |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
так ты sti делаешь только перед int 21h, а в here: делаешь cli -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
А что тут такого? Раскомментировать строку 59? Не поможет. Так как надо?
Почему DOS после отрабатывания программы не воспринимает клавиатуру? Куда делся обработчик INT 09h? Если убрать перепрограммирование, всё в порядке. Это сообщение отредактировал(а) JAPH - 5.2.2007, 19:03 -------------------- Что непонятно - спрашиваем |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
причем тут строка 59 насколько я понял переход в реальный режим тут
далее в back (читай комментарии)
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Если оставить только конечное перепрограммирование, та же проблема.
Что касается последнего lidt, он должен загрузить в IDTR его значение в реальном режиме, то есть базу 0 и предел 03FFh. Я так понял, тут то же, что заставляет прописывать в CS и SS нечто с лимитом 0FFFFh для выхода из PM. (Я сначала забыл про это - заработал перезагрузку) И всё же, чем мешает cli? Это не должно влиять на контроллер. Разрешить прерывания я решаюсь только после закрытия A20 и разрешения маскируемых прерываний. Конечно, можно перенести перепрограммирование поближе к sti, но что это изменит? -------------------- Что непонятно - спрашиваем |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
в реальном режиме процессор регистр LDTR вообще не смотрит а обращается напрямую к таблице векторов прерываний по 0000:0000h, такова логика
Нет, конечно на контроллер это не влияет однако, сделав cli, процессор не реагирует на сообщения контроллера о возникновении прерываний => процессор не начинает их обработку Это сообщение отредактировал(а) MAKCim - 5.2.2007, 20:37 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Ну дык перед выходом из программы происходит sti. По идее, ОС уже должна реагировать на прерывания?
-------------------- Что непонятно - спрашиваем |
|||
|
||||
![]()
|
| Правила форума "Asm для Windows/DOS" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для Windows/Dos | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |