![]() |
Проблема при переводе процессора в защищенный режим
Возникает следующая проблема. Когда я подготавливаю дескриптор в таблице GDT для сегмента стека, то указываю, что этот сегмент расширяется вниз, то есть устанавливаю бит ED (Expand Down). Но, при таком значении этого бита, процессор отказывается переходить в защищенный режим. Если этот бит сбросить в 0, то все нормально. Почему так происходит? В моей книжке в тексте примера этот бит установлен, но на дискете к книге в исходнике этот бит сброшен, т.е. сегмент стека является просто сегментом данных. Ничего по этому поводу в книге не говорится. Может, кто нибудь знает, в чем дело. Подскажите, пожалуйста.
|
LeonidPr
Что-то немного непонятно -- чего ты хочешь добиться,какая твоя цель? Да,стек в принципе является сегментом данных,но у него есть одна характерная особенность -- он растёт в сторону младших адресов,и у меня подобное поведение ассоциируется как раз с расширением вверх. А если к тому же учесть,что эта особенность заложена в алгоритм команд работы со стеком,то можно предположить,что именно это разногласие и обуславливает капризы процессора. Что за книжка,какой пример??В общем,подробнее пожалуйста. |
Под расширением вниз я подразумеваю уменьшение esp командой push. в принципе, я обычный сегмент данных могу отвести под стек и установить sp=Limit-1. Но, не будет ли потом проблем? Именно для этого, ведь, в дескрипторе существует разряд ED. А, вот у Фроловых в "Библиотеке Системного Программиста" этот бит установлен. А книжка - В.Юров "Ассемблер". Книга мне понравилась, так как описывает и сам язык и его применение довольно подробно. Пример к главе 16. Он единственный в этой главе. В примере еще выводится сообщение на экран, но это не суть важно.
|
У Юрова есть опечатки. Так что нужно доверять дискете.
|
LeonidPr
Есть у меня этот Юров "ASSEMBLER, 2-ое издание", но у меня глава 16 называется "Создание Windows-приложений на ассемблере",и никаких примеров перехода из реального режима процессора в защищённый там понятно нет.Но я скачивал дополнительные файлы к книге,и там действительно есть этот пример. Насколько я понял,ты говоришь о поле типа дескриптора,т.е. о битах 41, 42 и 43. Вот отрывок из кода с дискеты: Код:
;бит 2 Можешь посмотреть тут небольшую таблицу. Согласен с BlackEric'ом насчёт опечаток,но в данном случае бит должен быть установлен,иначе мы наверно останемся без сегмента стека.Возможно,что ошибка кроется где-то в другом месте. |
LeonidPr
Про переход в защищённый режим можно почитать ещё тут . |
Время: 12:41. |
Время: 12:41.
© OSzone.net 2001-