Это большая куча памяти, но есть указатель стека, который указывает на вершину стека. На толчке он идет вверх, на поп он падает. Но часто вы можете обмануть, просто изменив указатель, и таким образом вы можете вернуть значение, которое уже было извлечено.
Не во всех архитектурах стек движется в одном направлении. В конце концов это не имеет значения вообще. Некоторые системы увеличивают указатель стека при нажатии и уменьшают при нажатии, другие системы уменьшают при нажатии и увеличивают при нажатии.
Пример: указатель стека имеет значение 0x100, и это увеличивающаяся система.
Затем вы нажимаете, и указатель стека находится в 0x104. Вы нажимаете снова, в 0x108. Вы поп, назад к 0x104.
Другая система должна была бы начинаться с 0x100, понижаться до 0xfc, а затем понижаться до 0xf8 и возвращаться к 0xfc. Если вы снова появитесь, вы вернетесь к 0x100. Если вы затем вычтите 8 из стека указателя, он вернется к 0xf8, так что вы можете выскочить их снова. (Или, что бы C-компилятор делал в конце функции, просто добавьте / вычтите 12 из стека указателя, а не выталкивайте 3 локальные переменные в 3 инструкциях.