D.3.5. Особенности "стековой адресации".

Во всех CISC-процессорах аппаратно поддерживается стек, т.е. область оперативной памяти, предназначенная для временного хранения любой информации. Для стека характерны две операции: включение в стек "вталкивание" и извлечение "выталкивание" данных из стека. Включения и извлечение производятся с одного конца, называемого вершиной стека (Top Of Stack – TOS или Stack Top – ST), таким образом, что последнее включение в стек извлекается из него первым. Такая дисциплина называется LIFO (Last In – First Out, "последним пришел – первым ушел").

Предполагается, что область памяти для стека находится в специальном сегменте стека. В микропроцессорах Intel его адрес находится в паре SS:SP и SS:ESP, причем регистр SS содержит базу регистра, а вершина стека адресуется смещением в SP или ESP. Алгоритм работы со стеком в микропроцессоре i80386 и старше в P-режиме следующий:

  1. Начало алгоритма вставки в стек.
  2. Проверяется значение в ESP.
  3. Если оно меньше четырех, то генерируется особый случай нарушения стека.
  4. Происходит декремент ESP на четыре и операнд сохраняется по адресу SS:[ESP].
  5. Конец алгоритма вставки в стек.
  1. Начало алгоритма извлечения из стека.
  2. Проверяется значение в ESP.
  3. Если адрес SS:[ESP] находится вне пределах сегмента стека (адрес слишком большой и не помещается в стек), формируется особый случай нарушения стека.
  4. Если же обращение разрешенное, то считываются данные по адресу SS:[ESP] и осуществляется инкремент ESP на четыре.
  5. Конец алгоритма извлечения из памяти.

В стек можно включить содержимое регистра, ячейки памяти или константу (процессор i8086/88 включать в стек константы не может). Извлечь данные из стека можно в регистр или ячейку памяти.

Как видно из предложенного алгоритма, сегмент стека заполняется не "с ног до головы" (т.е. от меньших адресов к большему), а наоборот, от больших адресов к меньшим. Это свойство сегмента специально указывается особым флажком в дескрипторе сегмента.

Сказанное относится к реализации стека в микропроцессорах корпорации Intel. В микропроцессорах Motorola вершина стека автоматически привязана к регистру A7 (и его копии A7' в режиме супервизора). Далее распределением базового адреса сегмента стека и управление его работой перекладывается на плечи операционной системы (т.е. на системного программиста). Отметим, что загрузка стека для программы супервизора осуществляется только при первоначальной загрузки процессора и программно недоступна, а загрузка стека программы пользователя является привилегированной командой и выполняется только в режиме супервизора. Об этом надо помнить, манипулируя со стеком на этой платформе.

 

Назад...   К оглавлению раздела   Далее...

=== *** === *** === *** ===

В настоящее время проект закрыт (в версии 1.00.3 alpha). Автор приносит извинения за прекрашение разработки.