Указатель стека

Регистр указателя стека SP - это 16-битовый регистр, который определяет смещение текущей вершины стека. Микропроцессор использует указатель стека вместе с сегментным регистром стека для формирования физического адреса. Во всех ссылках на стек, включая команды PUSH, POP, CALL и RETURN микропроцессор использует регистровую пару SS:SP. Пара регистров SS:SP всегда указывает на текущую вершину стека. Когда команда помещает слово в стек, содержимое регистра SP уменьшается на два. Когда слово извлекается из стека, микропроцессор увеличивает содержимое регистра SP на два. Стек растет в направлении меньших адресов памяти. Все стековые операции обрабатывают слова данных; один байт не может быть помещен в стек либо извлечен из стека.

Микропроцессор изменяет содержимое регистра SP в соответствии с работой стека, а содержимое регистра SS не изменяется никакими стековыми операциями. Программа загружает регистр SS независимо от каких-либо команд PUSH или POP, и этот регистр определяет сегмент, в котором располагается стек. Это означает, что стек системы ограничен по длине 64K байтами. Например, если программа установила регистр SS на 1000H, а регистр SP на 0, первый объект, помещаемый в стек, попадает в адреса 1000:FFFFH и 1000:FFFEH. Последовательно помещенные в стек объекты будут продолжать располагаться во все меньших и меньших адресах памяти до тех пор, пока последний возможный объект стека не займет адреса 1000:0001H и 1000:0000H. Если в этот момент программа помещает еще один объект в стек, он попадает в ячейки 1000:FFFFH и 1000:FFFEH, которые являются первыми ячейками стека. Так как теперь стек "завернулся", это разрушило ранее записанную в него информацию.

При нормальном использовании длина стека не достигает 64K байт. Если программа организует стек из 512 байт, она может инициализировать пару регистров SS:SP значением 1000:0200H; при этом первая ячейка стека имеет адрес 1000:0200H, а последняя доступная ячейка - адрес 1000:0000H. Если программа поместит в стек более 256 слов, уменьшение содержимого регистра SP приведет к переходу его значения через нуль, и начнется запись стековой информации с другой стороны стекового сегмента. Тогда программа поместит стековые данные в область памяти, не предназначенную для стека, в данном примере по адресу 1000:FFFFH. В этом случае может произойти одна из следующих двух неприятностей. Либо стек может перекрыть программу или данные, которые не должны быть разрушены. Либо стековые данные попадут в область адресного пространства, которая не содержит физической памяти. Найти любую из этих ошибок во время отладки программы может быть очень тяжело, поэтому под системный стек необходимо отводить достаточно места. В случае IBM PC, использующей дисковую операционную систему фирмы IBM, рекомендуется оставлять для стека по крайней мере 128 байт. Этого места достаточно для обеспечения правильной работы DOS и вашей программы.

Хостинг от uCoz