Cтраница 1
Сегмент стека резервирует в памяти место для адресов возврата. [1]
Поскольку сегмент стека может иметь до 64 Кбайт, то возможности вложения практически не ограничены. [2]
![]() |
Листинг трансляции примера программы 54. [3] |
Для сегмента стека и сегмента данных эти числа показывают значения, запоминаемые в каждой ячейке памяти. Для сегмента команд эти числа означают машинные коды, выполняемые микропроцессором 8088; текст в правой части листинга взят из исходной программы. [4]
![]() |
Сегментированная память позволяет каждой таблице расти или уменьшаться независимо от других таблиц. [5] |
Длина сегмента стека может увеличиваться всякий раз, когда что-либо помещается в стек, и уменьшаться при выборке данных из стека. [6]
Сами ячейки входят в различные фреймы, расположенные в сегментах стека А и В ( но не в С), и ранее им были присвоены данные посредством образования фреймов из сегмента С. В результате выполнения операции восстановления регистр ВС возвращается в состояние СЛ ( БТВ) ( и при этом эффективным образом отбрасывается сегмент следа С), затем регистр БТВ возвращается в состояние ПТВ ( БТВ), а сегмент С из стека удаляется. На этом операция возврата заканчивается, и исполнение программы возобновляется обычным образом. [7]
Здесь первые две команды CALL извлекают адреса процедур из сегмента данных, а последняя - из сегмента стека. [8]
Имеются четыре сегментных регистра, определяющих четыре непосредственно адресуемых текущих сегмента: программный, сегмент данных, сегмент стека и экстракодовый. Сегмент памяти становится текущим и доступным для обращения после загрузки его сегментного адреса в сегментный регистр. [9]
Кодовый сегмент содержит машинные команды программы, сегмент данных содержит данные, использусмие программой, дополнительный сегмент - дополнительные данные, сегмент стека содержит стек. [10]
Так как каждая команда CALL помещает в стек два или четыре байта адреса, то число уровней вложения ограничено только размером сегмента стека. [11]
В UNIX под процессы отводится часть памяти, которая, в свою очередь, делится на три сегмента: текстовый ( то есть код программы), сегмент данных ( переменные) и сегмент стека. Сегмент данных растет снизу вверх, а стек увеличивается сверху вниз, как показано на рис 1.18. Между ними существует часть неиспользованного адресного пространства. Стек автоматически занимает такую часть этого участка памяти, какую необходимо, но расширение сегмента данных выполняется явным образом. Для этого используется специальный системный вызов brk, задающий новый адрес для границы сегмента данных. Однако этот вызов не определен стандартами POSIX, так как программистам для динамического распределения памяти рекомендуется использовать библиотечную процедуру malloc. Было решено, что низкоуровневую реализацию процедуры malloc не следует стандартизировать, потому что мало кто вызывает ее напрямую. [12]
Источники логического адреса для различных типов обращения к памяти приведены в табл. 1.14. Команды всегда выбираются из текущего сегмента кода в соответствии с логическим адресом CS: IP. Стековые команды всегда обращаются к текущему сегменту стека по адресу SS: SP. Если при вычислении адреса ЕА используется регистр ВР, то обращение производится также к стековому сегменту. В последнем случае принцип стека первый пришел - последний вышел игнорируется и ячейки стекового сегмента рассматриваются как ОЗУ с произвольной выборкой, что обеспечивает большую гибкость в использовании этих ячеек. [13]
При использовании глобальных переменных и типизованных констант следует помнить, что они находятся в сегменте данных, и адрес этого сегмента хранится в регистре DS. Все локальные переменные расположены в сегменте стека. [14]
На рис. 2.1 показан текст нашей программы копирования таблицы. Обратите внимание, что она имеет сегмент стека STACK, сегмент данных DSEG и сегмент команд CSEG. [15]