Почему стеки обычно растут вниз?



Я знаю, что в архитектурах, с которыми я лично знаком (x86, 6502 и т. д.), стек обычно растет вниз (т. е. каждый элемент, помещенный в стек, приводит к уменьшению SP, а не к увеличению).



Я задаюсь вопросом об историческом обосновании этого. Я знаю, что в едином адресном пространстве удобно запускать стек на противоположном конце сегмента данных (скажем), поэтому проблема возникает только в том случае, если две стороны сталкиваются посередине. Но почему стек традиционно получает верхнюю часть? Особенно учитывая, насколько это противоположно "концептуальной" модели?



(и обратите внимание, что в архитектуре 6502 стек также растет вниз, хотя он ограничен одной 256-байтовой страницей, и этот выбор направления кажется произвольным.)

630   6  

6 ответов:

что касается исторического обоснования, я не могу сказать наверняка (потому что я их не проектировал). Мой мысли дело в том, что ранние процессоры получили свой исходный счетчик программ, установленный в 0, и это было естественное желание запустить стек на другом конце и расти вниз, так как их код естественно растет вверх.

в стороне, обратите внимание, что эта настройка счетчика программы на 0 при сбросе не относится к все ранние процессоры. Например, Motorola 6809 будет получать счетчик программ с адресов 0xfffe/f таким образом, вы можете начать работать в произвольном месте, в зависимости от того, что было предоставлено по этому адресу (обычно, но ни в коем случае не ограничиваясь, ROM).

одна из первых вещей, которые будут делать некоторые исторические системы, - это сканировать память сверху, пока она не найдет место, которое будет считывать одно и то же записанное значение, чтобы оно знало фактическую установленную оперативную память (например, z80 с адресным пространством 64K не было обязательно имейте 64K или RAM, на самом деле 64K было бы огромные в мои первые дни). Как только он найдет верхний фактический адрес, он установит указатель стека соответствующим образом и сможет начать вызывать подпрограммы. Это сканирование обычно выполняется ЦП, работающим с кодом в ПЗУ, как часть запуска.

что касается роста стеков, то не все они растут вниз, см. ответ для сведения.

одно хорошее объяснение, которое я слышал, состояло в том, что некоторые машины в прошлом могли иметь только неподписанные смещения, поэтому вы хотели бы, чтобы стек рос вниз, чтобы вы могли поразить своих местных жителей, не теряя дополнительную инструкцию для подделки отрицательного смещения.

одной из возможных причин может быть то, что она упрощает выравнивание. Если вы помещаете локальную переменную в стек, который должен быть помещен на 4-байтовую границу, вы можете просто вычесть размер объекта из указателя стека, а затем обнулить два младших бита, чтобы получить правильно выровненный адрес. Если стек растет вверх, обеспечение выравнивания становится немного сложнее.

IIRC стек растет вниз, потому что куча растет вверх. Могло быть и наоборот.

Я считаю, что это чисто дизайнерское решение. Не все они растут вниз-см. это так нити для некоторого хорошего обсуждения направления роста стека на разных архитектурах.

Я считаю, что Конвенция началась с IBM 704 и его печально известного "регистра декремента". Современная речь назвала бы это смещением поля инструкции, но дело в том, что они пошли вниз,недо.

Comments

    Ничего не найдено.