Организация стека в З/Р(pmode)
Кажется, я понял, почему компьютер перезагружался. Понял я это после варьирования параметров стека. Вот мои вопросы:
Когда объявляем стек, параметр(п.) НАЧАЛО означает, при расширении в сторону младших адресов(кстати, какой при это байт атрибутов), начало куска памяти под стек или максимальный(начальный) адрес?
п. РАЗМЕР - размер куска памяти под стек или что-то другое, какие-то границы(как написано в двухтомном описании 486)?
Привет всем!
Кажется, я понял, почему компьютер перезагружался. Понял я это после варьирования параметров стека. Вот мои вопросы:
Когда объявляем стек, параметр(п.) НАЧАЛО означает, при расширении в сторону младших адресов(кстати, какой при это байт атрибутов), начало куска памяти под стек или максимальный(начальный) адрес?
п. РАЗМЕР - размер куска памяти под стек или что-то другое, какие-то границы(как написано в двухтомном описании 486)?
Под объявлением стека ты подразумеваешь занос селектора его сегмента в SS?
Привет всем!
Кажется, я понял, почему компьютер перезагружался. Понял я это после варьирования параметров стека. Вот мои вопросы:
Когда объявляем стек, параметр(п.) НАЧАЛО означает, при расширении в сторону младших адресов(кстати, какой при это байт атрибутов), начало куска памяти под стек или максимальный(начальный) адрес?
п. РАЗМЕР - размер куска памяти под стек или что-то другое, какие-то границы(как написано в двухтомном описании 486)?
Как я понял ты про дескриптор, описывающий сегмент стека? Ваще лучше использовать для стека обычный сегмент данных с расширением вверх. Тут все обычно, БАЗА сегмента и РАЗМЕР, т.е. младший линейный адрес (адрес после всех преобразований: селектор + смещение и т.д.) этого сегмента будет от БАЗЫ до БАЗЫ + РАЗМЕР. Если же мы выберем сегмент расширяющиеся вниз, то линейное пространство этого сегмента будет: от БАЗЫ - РАЗМЕР до БАЗЫ. Введено это для динамических сегментов стека, размер у которых меняется время от времени. Вообще такими сегментами я никогда не полязовался, а пользовался обычными сегментами данных, они проще - просто загружаешь в ss селектор сегмента, а esp устанавливаешь на размер (ну или там на границу) этого сегмента данных.
Как я понял ты про дескриптор, описывающий сегмент стека? Ваще лучше использовать для стека обычный сегмент данных с расширением вверх. Тут все обычно, БАЗА сегмента и РАЗМЕР, т.е. младший линейный адрес (адрес после всех преобразований: селектор + смещение и т.д.) этого сегмента будет от БАЗЫ до БАЗЫ + РАЗМЕР.
Спасибо за совет, но все ж таки я привык пользоваться обычным, классическим стеком с расширением в сторону младших адресов.
Если же мы выберем сегмент расширяющиеся вниз, то линейное пространство этого сегмента будет: от БАЗЫ - РАЗМЕР до БАЗЫ.
То есть, если я объявлю сегмент стека с расш. вниз, который располагается по 0, размер 100, я должен в БАЗУ занести 100, в esp - тоже 100?
Введено это для динамических сегментов стека, размер у которых меняется время от времени. Вообще такими сегментами я никогда не полязовался, а пользовался обычными сегментами данных, они проще - просто загружаешь в ss селектор сегмента, а esp устанавливаешь на размер (ну или там на границу) этого сегмента данных.
Это как? Можно и в сегменте данных адреса уменьшать, как в стеке?(объявит данные, но идент. стеку?)
Спасибо за совет, но все ж таки я привык пользоваться обычным, классическим стеком с расширением в сторону младших адресов.
То есть, если я объявлю сегмент стека с расш. вниз, который располагается по 0, размер 100, я должен в БАЗУ занести 100, в esp - тоже 100?
Это как? Можно и в сегменте данных адреса уменьшать, как в стеке?(объявит данные, но идент. стеку?)
Ща я попробую объяснить, я не совсем правильно выразился насчет БАЗА - РАЗМЕР. Короче смотри, как процессор следит за границами сегменита.
1. Сегмент расширяется вверх. Генерируется #GP, если смещение болеше размера сегмента (поле LIMIT в дескрипторе сегмента, учитывая бит гранулярности)
2. Сегмент расширяемый вниз. Генерируется #GP, если смещение не попадает в диапазон LIMIT + 1 до 0FFFFFFFFh для 32-х разрядного сегмента и до 0FFFFh для 16-ти разрядного.
Т.е. для таких сегментов стек располагается только в старших адресах. Если поле LIMIT равно 0, то это значит что размер сегмента равен 4 гб. Вот собственно и все.
Т.е. у тебя полюбому не получится стек в диапозоне от 0h до 100h если использовать стек с расширением вниз (т.е. получится, но через заднее место Base Address на ноль, esp = 100h, LIMIT = 0). Для этой цели воспользуйся обычным сегментом данных (чего тебе не нравится) с БАЗОЙ = 0, LIMIT = 100h, esp = 100h. Ни какой разницы.
Т.е. у тебя полюбому не получится стек в диапозоне от 0h до 100h если использовать стек с расширением вниз (т.е. получится, но через заднее место Base Address на ноль, esp = 100h, LIMIT = 0). Для этой цели воспользуйся обычным сегментом данных (чего тебе не нравится) с БАЗОЙ = 0, LIMIT = 100h, esp = 100h. Ни какой разницы.
В этом случае стек тоже будет расти "вниз"?
Какая тогда разница?
Спасибо!
В этом случае стек тоже будет расти "вниз"?
Какая тогда разница?
Спасибо!
Да, он будет расти вниз, т.е. esp будет уменьшаться как и положено. Сегменты расширяюшиеся вниз используются для стековых сегментов, которые меняют свой размер во времени. Т.е. если использовать обычный сегмент при уменьшении значения поля LIMIT, будут потеряны значения, которые были заPUSHены первыми, а при увеличении стек будет уже располагаться не сверху, а посередине сегмента, и эффекта от увеличения ты не получишь. А у сегмента, расширяемого вниз граница движется внизу, поэтому изменение поля LIMIT не изменит само содержимое стека, а так же даст эффект от увеличения сегмента.
Далее, не думайте, раз сегмент расширяется вниз, значит это именно сегмент стека. Это не обязательно!!! Такие сегменты различаются только лишь организацией проверки на выход за границы сегмента и все. Такие сегменты можно спокойно использовать и под данные.
Да, он будет расти вниз, т.е. esp будет уменьшаться как и положено.
А какая разница между обычным сегментом стека и сегментом данных с расширением вниз? Только проверка на выход за границы? А какой байт атрибутов у такого сегмента?
А какая разница между обычным сегментом стека и сегментом данных с расширением вниз? Только проверка на выход за границы? А какой байт атрибутов у такого сегмента?
А что, разве есть обычный сегмент стека?
А что, разве есть обычный сегмент стека?
Ну, вроде, речь идет о стеке, и сегменте данных, приспособленном под стек. Или я чего-то недопонял?!
Все, говорю последний раз. Нет сегментов приспособленных под сегмент стека!!! Есть сегменты данных с расширением вверх и вниз. Их различия я описал выше. Различаются помойму они битом B поля атрибутов сегментов (могу ошибаться).
Ладно, ладно, молчу!
Просто мне так удобнее именовать - "стек" и остальное. Исправлюсь...