%rsp - Re-extended Stack Pointer - Указатель стека.
%rbp - Re-extended Base Pointer - Указатель базы.
В начале выполнения программы %rsp содержит адрес, слева от которого можно хранить данные.
Для работы со стеком используются два регистра: %rsp и %rbp
%rsp - адрес левой границы стека
%rbp - адрес правой границы стека
Перед использованием стека нужно скопировать содержимое регистра %rsp в %rbp
Для того, чтобы выделить на стеке память под N байтов нужно вычесть число N из регистра %rsp, тем самым "сместить" %rsp влево на N байтов.
В конце программы память на стеке нужно освободить. Для этого нужно скопировать значение регистра %rbp в %rsp
//--------------------------------------------------
Если в программе применяются функции, использующие стандартизированные соглашения о вызовах функций (например функции стандартной библиотеки языка Си), то стек должен быть выровнен по 16-байтовой границе, т.е адреса правой и левой границ стека должны быть кратны 16 (Шестнадцатеричное представление должно оканчиваться на 0).
В начале программы адрес правой границы стека изначально кратен 16. Далее, память на стеке нужно выделять порциями, объём которых кратен 16.
//----------------------------------------------
Данные можно помещать в стек не выделяя для них память явным образом. Но, в этом случае нужно иметь в виду, что данные будут храниться в той области памяти, которая будет числиться незанятой, поэтому есть вероятность, что эти данные могут быть перезаписаны другими командами.