Вопрос № 69096: Здравствуйте уважаемые эксперты. Помогите написать небольшую программу переводящую процессор из реального режима в защищенный. Привожу код, программа загружается со второго сектора флоппи, непосредственно из биоса и загружает ее программа неходящааяс...Вопрос № 69141: Ув. эксперты!
Подскажите, почему при запуске под отладчиком прога работает прекрасно, а при запуске из командной строки выдаёт управляющие символы ASCII и псевдографику?
Программа должна выводить на экран вещественное число.
Ком...
Вопрос № 69.096
Здравствуйте уважаемые эксперты. Помогите написать небольшую программу переводящую процессор из реального режима в защищенный. Привожу код, программа загружается со второго сектора флоппи, непосредственно из биоса и загружает ее программа неходящааяся на первом секторе, и комп перегружается.
Вопросов несколько - при переходе в защищенный режим после команд
mov EAX,cr0;
or eax,1;
mov cr0,eax;
объясните как процессор переходит на следующую команду, ведь если он уже работает в защищенном режиме значит он обращается к памяти через gdt_null, так как cs = 0, что и вызывает ошибку. По моему тоже самое должно происходить при переходе в реальный режим, только без ошибки. Просто вычитал этот код в одной книге и стало интересно. Подскажите что вообще не правильно сделал и как правильно перевести проц в защищенный режим?
Приложение:
Отправлен: 30.12.2006, 01:56
Вопрос задал: RIV (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: ramok
Здравствуйте, RIV!
Очень резонный вопрос Ж:-)
Все дело в так называемых теневых регистрах(shadow register). Дело в том что при каждом обращении к памяти, процессор не вычисляет все значения через gdt или ldt как можно было бы подумать(представьте себе накладные расходы такого варианта). Вычисления происходят только при изменения значения сегментных регистров(cs, ds, ss....), а вычесленная информация заностится в теневые регистры.
В них хранится база, лимит и права доступа.
Так что когда вы меняете cr0, то вычисление адреса по прежнему происходит из теневых регистров пока вы не изменяете сегментный регистр.
Отсюда можно сделать два вывода:
1. Вычисление через адреса в реальном режиме все равно проиходит через эти теневые регистры, просто база, лимиты и права соответствуют тому, чему мы привыкли в реальном режиме.
2. Если вы решили изменить дескриптор какого то либо сегмента, то для того что бы изменения занеслись в сегментный регистр, вам нужно перезагрузить соответствующий сегментный регитр.
Дополнительную информацию можно найти в поисковых системах интернет по запросу "теневые регистры защищенный режим"
Ответ отправил: ramok (статус: 4-ый класс)
Ответ отправлен: 30.12.2006, 02:45 Оценка за ответ: 5
Вопрос № 69.141
Ув. эксперты!
Подскажите, почему при запуске под отладчиком прога работает прекрасно, а при запуске из командной строки выдаёт управляющие символы ASCII и псевдографику?
Программа должна выводить на экран вещественное число.
Компилятор TASM
Отвечает: Брона Вячеслав
Здравствуйте, Олег Владимирович!
Все дело в том, что Вы не инициализировали значения сегментов DS и ES.
Добавьте в начало программы
push DS
push ES
mov AX, SEG RES
mov DS,AX
mov ES,AX
и в конец:
pop ES
pop DS
Все остальное вроде правильно.
Дело в том, что отладчик "помогает", инициализируя DS и ES сегменты.
Ответ отправил: Брона Вячеслав (статус: 2-ой класс)
Ответ отправлен: 02.01.2007, 13:42 Оценка за ответ: 2
Отвечает: QDSota
Здравствуйте, Олег Владимирович!
1. Команда enter 4,0 освобождает 4 байта по чуть другим адресам (bp уже равно sp-2): в данном случае первую двойку вычитать не надо, необходимо использовать адреса для переменных [bp] и [bp-2]... То есть - самое простое - все строки "word ptr[bp-4]" заменить на "word ptr[bp]"
2. Нужно изменить строку "outp2: fild dword ptr [bp-2]" на "outp2: fild word ptr [bp-2]" - число 2-хбайтовое...
--------- Открыть глаза навстречу солнцу
Ответ отправил: QDSota (статус: Профессионал) Россия, Зеленоград Тел.: 8-916-53-43-916 ICQ: 84611301 ---- Ответ отправлен: 03.01.2007, 12:08 Оценка за ответ: 2