PDA

Показать полную графическую версию : Проблема при переводе процессора в защищенный режим


LeonidPr
27-04-2006, 21:17
Возникает следующая проблема. Когда я подготавливаю дескриптор в таблице GDT для сегмента стека, то указываю, что этот сегмент расширяется вниз, то есть устанавливаю бит ED (Expand Down). Но, при таком значении этого бита, процессор отказывается переходить в защищенный режим. Если этот бит сбросить в 0, то все нормально. Почему так происходит? В моей книжке в тексте примера этот бит установлен, но на дискете к книге в исходнике этот бит сброшен, т.е. сегмент стека является просто сегментом данных. Ничего по этому поводу в книге не говорится. Может, кто нибудь знает, в чем дело. Подскажите, пожалуйста.

DillerInc
28-04-2006, 01:05
LeonidPr
Что-то немного непонятно -- чего ты хочешь добиться,какая твоя цель?
Да,стек в принципе является сегментом данных,но у него есть одна характерная особенность -- он растёт в сторону младших адресов,и у меня подобное поведение ассоциируется как раз с расширением вверх.
А если к тому же учесть,что эта особенность заложена в алгоритм команд работы со стеком,то можно предположить,что именно это разногласие и обуславливает капризы процессора.
Что за книжка,какой пример??В общем,подробнее пожалуйста.

LeonidPr
28-04-2006, 17:00
Под расширением вниз я подразумеваю уменьшение esp командой push. в принципе, я обычный сегмент данных могу отвести под стек и установить sp=Limit-1. Но, не будет ли потом проблем? Именно для этого, ведь, в дескрипторе существует разряд ED. А, вот у Фроловых в "Библиотеке Системного Программиста" этот бит установлен. А книжка - В.Юров "Ассемблер". Книга мне понравилась, так как описывает и сам язык и его применение довольно подробно. Пример к главе 16. Он единственный в этой главе. В примере еще выводится сообщение на экран, но это не суть важно.

BlackEric
28-04-2006, 20:26
У Юрова есть опечатки. Так что нужно доверять дискете.

DillerInc
28-04-2006, 21:56
LeonidPr
Есть у меня этот Юров "ASSEMBLER, 2-ое издание", но у меня глава 16 называется "Создание Windows-приложений на ассемблере",и никаких примеров перехода из реального режима процессора в защищённый там понятно нет.Но я скачивал дополнительные файлы к книге,и там действительно есть этот пример.
Насколько я понял,ты говоришь о поле типа дескриптора,т.е. о битах 41, 42 и 43.
Вот отрывок из кода с дискеты:

;бит 2
code_n equ 00000000b ;обычный сегмент кода
code_p equ 00000100b ;подчиненный сегмент кода
data_ equ 00000000b ;для сегмента данных
stack_ equ 00000000b ;для сегмента стека <-- должно быть 00000100b

В случае с сегментами данных установленный 42-ой бит,или E (Expand Down),указывает на то,что это стек.
Можешь посмотреть тут (http://avsdov.newmail.ru/modes/descr.htm) небольшую таблицу.
Согласен с BlackEric'ом насчёт опечаток,но в данном случае бит должен быть установлен,иначе мы наверно останемся без сегмента стека.Возможно,что ошибка кроется где-то в другом месте.

DillerInc
02-05-2006, 23:33
LeonidPr
Про переход в защищённый режим можно почитать ещё тут (http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=12020) .




© OSzone.net 2001-2012