![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 20.08.2008
Сообщений: 7
|
![]()
привет всем.
на этот раз у мня возникла проблема с выходом из защищенного режима. Все подготовил к переходу в реальный режим : настроил дескрипторы, в cr0 сбросил бит, затем far jmp, настроил сегментные регистры, корочя говоря все как положено(с этим у мня не было проблем). В защищенном режиме программ ничего не делает, аппаратные прерывания запрещенны. Теперь настриваю таблицу веторов прерывания IDTR: mov ax, 3ffh mov word ptr pdescr, ax mov eax, 0 mov dword ptr pdescr+2, eax lidt pdescr sti Корочь после sti у мня процессор перегружается. Корочь хер знает в чем проблема, я не знаю. запускал программу на dos 6.11(установлен на виртуальной машине) компилил на tasm 4.1 |
![]() |
![]() |
![]() |
#2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
форматы IDT защищённого и реального отличаются друг от друга. как ты подготавливаешь IDT реального режима?
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 20.08.2008
Сообщений: 7
|
![]()
Про формат и подготовку idt не очень понял.
Знаю только что в защищенном режиме необходимые данные обратчика хранится в формате шлюза, ну там номер селектора, смещение и т.д., а реальном это число из 4 байтов: 2 байта - адрес сегмента, 2 -байта смещение. idt никак не подготавливаю . Просто загрузил адрес таблицы векторов прерывания: cli ;;;;;;;;;;;;pdescr - переменная размером в 6 байт mov word ptr pdescr, idt_size-1 xor eax, eax mov ax, offset idt add eax, ebp ;ebp - адрес сегмента данных, ;который содержит глобальную таблицу ;дескрипторов и таблицу прерываний ; eax += ebp - адрес таблицы векторов mov dword ptr pdescr+2, eax lidt pdescr это все в реальном режиме. да и вообще тупо скатал с книги Рудакова язык ассемблер уроки программирования. пример 67.1. стр 312 код проверил, вроде все правильно, вроде ничего не забыл списать. Меня еще один момент смутил. У него написано что для выхода из защищенного режима надо указать адрес таблицу веторов прерывания реального режима(0000h:3ffh). Проверил значения команды sidt которые он мне вернул: так там смещение равно ffffh. Почему так? |
![]() |
![]() |
![]() |
#4 |
Регистрация: 20.08.2008
Сообщений: 7
|
![]()
пардон не смещение, а размер таблицы, последнее предложение, размер после команды sidt равно ffffh
|
![]() |
![]() |
![]() |
#5 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
в принципе: какая разница какой там размер? главное чтобы был не меньше самой таблицы.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Опять про гистограммму | artemavd | Общие вопросы Delphi | 10 | 15.07.2008 11:44 |
И опять мэйлы.. Опять... | Pusher | PHP | 6 | 28.06.2008 03:08 |
И опять LookupComboBox | Alex_666 | БД в Delphi | 1 | 02.06.2008 10:22 |
Опять Word | krem | Общие вопросы Delphi | 3 | 08.05.2007 16:27 |