Здравствуйте. Подскажите, пожалуйста. Мне необходимо узнать структуру памяти, занимаемую модулем .COM в ОП. Сложность возникла со стеком. Его начало располагается в SP по адресу FFFE. А где его дно и почему? Этот момент поподробней, пожалуйста. Я так понимаю, что стек растет от большего адреса к меньшему. Вот до какой степени он может расти? Я подумал, что дно находится по адресу 0000, но это оказалось не верно. Будет ли он залезать в префикс сегмента команд (PSP)?
Стек растет от больших адресов в меньшие. То есть от FFFE и к 0000, для .com'ов. Расти он будет до предела сегмента, то есть до 0000. И если ты переместишь код в другой сегмент, и будешь что-то убирать и убирать в стек, то конечно же он залезет и в PSP. Как правило, если нужен такой стек, в 64К, то перемещают стек, а не код - благо это проще. Когда sp=0000, и происходит попытка что-то еще туда записать, в зависимости от загруженных (или не загруженных) himem.sys - emm386 или других менеджеров расширенной памяти, или загруженных пользователем таблиц дескрипторов, будет либо ошибка с аварийным завершением программы или DOS целиком, либо ошибка, которая никем не обработается (потому что по умолчанию обработчик указывает на заглушку, кажется), и sp=FFFE, и пойдет затирание старого стека в том же сегменте. Но вообще поведение программы и ОС в данном случае непредсказуемо, и может зависеть не только от менеджеров памяти, но и от производителя и версии BIOS. Для реального 16-битного режима стек не может быть больше чем 64К в принципе.
Возник ещё один вопрос, касающийся PSP. В формате PSP указано, что по смещению 2С указывается сегментный адрес среды, передаваемой программе. Мне надо подробно узнать про среду: когда она создается: перед запуском приложения или в другое время; откуда берётся информация, записываемая в среду; среда передается только моему приложению или всем запущенным. Подскажите, пожалуйста, где можно про среду почитать (на русском)? Не могу найти, т.к. слово среда очень многозначное, и я слабо себе представляю что такое среда.
Ещё environment переводят как окружение, подразумевая переменные окружения (среды) на момент запуска программы.
О, то что надо. Спасибо за К. Г. Финогенова, в его книжке "Самоучитель по системным функциям MS-DOS" это разбирается в восьмой главе.