GNU Assembler x64. Сезон 2. Сегмент стека

Опубликовано: 29 Март 2026
на канале: SockFD
564
36

%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.

//----------------------------------------------

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