Описание тега stack-pointer
Архитектуры ЦП, которые используют стек вызовов, обычно имеют целочисленный регистр, предназначенный для хранения указателя на границу между используемым и свободным пространством стека.
Обычно его называют "верхним" стеком, хотя в большинстве систем это самый низкий / нижний адрес. (Рост стека вниз, в то время как куча растет вверх, - очень распространенное соглашение (см. Также эти вопросы и ответы). Диаграммы макетов стека рисуются в любом случае - одни с высоким адресом вверху, а другие с младшим адресом вверху - поэтому еще раз проверьте, соответствует ли ваша терминология тому, что вы читаете или изменяете.
ПРИМЕЧАНИЕ. Термин "указатель стека" применяется только к стеку вызовов, используемому как часть вызова / возврата функции и / или сохранения регистров с сохранением вызовов для вызовов вложенных функций, а также освобождения места (также известного как кадр стека) для локальных переменных в функция.
Это не относится к указателям на другие структуры данных стека, используемые в более общем плане.
Использование указателя стека позволяет удобно выполнять функции рекурсии и повторного входа (по сравнению со статическим хранилищем). См. Эти вопросы и ответы по MIPS.
Некоторые архитектуры (например, x86) жестко закрепляют выбор в проекте, заставляя обработчики прерываний неявно использовать регистр указателя стека для передачи контекста в стек. x86 также имеет множество инструкций, которые неявно используют указатель стека (например,push
/ pop
, call
/ ret
), но при желании этого можно было бы избежать. Однако нет никакого способа обойтись без допустимого значения, по крайней мере, в ядре[e/r]sp
для прерываний.
Другие архитектуры (особенно MIP) используют только определенный регистр в качестве указателя стека по соглашению (т. Е. Соглашение ABI/ вызова), а другой ABI может использовать другой регистр в качестве указателя стека без потери эффективности. Или даже не использовать традиционный стек, даже для обработки прерываний.
Указатель стека на различных архитектурах:
x86:
sp
/esp
/rsp
: один из 8 (или 16 в 64-битном режиме) целочисленных регистров, используемых в качестве источника или назначения любой инструкции.(Поскольку 16-битный
sp
-Режимов относительной адресации не существует, 16-битный код вынужден копировать указатель стека в другой регистр для доступа к памяти стека, кроме push / pop. По условиюbp
регистр используется для хранения этой копии.)- рука:
sp
это синонимr13
. ARM переключает банки регистров при прерываниях вместо записи в память через указатель стека, но некоторые процессоры ARM в некоторых ситуациях неявно используют указатель стека для сохранения контекста прерывания. - arm64:
sp
больше не является регистром общего назначения, и здесь нет push-multiple, только один или пара (и нет мнемонического псевдонима). - mips: Стандартный язык ассемблера MIPS имеет псевдонимы для большинства регистров, которые соответствуют их использованию в стандартном / рекомендуемом соглашении о вызовах.
$sp
это псевдоним для$29
. - powerpc:
r1
используется в качестве указателя стека в общем PowerPC ABI - sparc:
%sp
это псевдоним для%o6
, регистрационный номер 14. Это и%fp
/%i6
участвуют в работе скользящего окна регистров, которую выполняет SPARC, вместо того, чтобы управлять глобальными регистрами отдельно. См. Раздел " Общие сведения о стеках и регистрах в архитектуре (ах) Sparc". - итан: два указателя стека:
sp
для автоматического хранения и второй стек для сброса регистров, когда в микроархитектуре заканчиваются физические регистры для механизма окна регистров. Это несколько похоже на SPARC. - avr:
SP
(состоит из двух 8-битных половин,SPH
а такжеSPL
) отделен от тридцати двух 8-битных регистров общего назначения. Он может использоваться неявно для push/pop, но только для чтения / записи напрямую как порт ввода / вывода. (В отличие от трех других 16-битных указателей, состоящих из пар регистров GP).
Как правило, вопросы также следует помечать одним из этих специфичных для архитектуры тегов!