Когда я должен использовать регистр RSP, чтобы добавить пространство в стек? - PullRequest
0 голосов
/ 29 марта 2019

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

Я использую NASM версии 2.13.03 в системе Unix (macos) intel x86_64.

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

Я понял, что увеличение стека с помощью sub rsp следует использовать перед вызовом функции, а добавление rsp следует использовать после вызова функции.

Я знаю, что в 32-битной архитектуре вы используете push и pop для увеличения стека по мере продвижения, но в этой 64-битной архитектуре необходимо использовать sub rsp и add rsp, а также инструкцию mov для добавления регистров на стек.

Если у кого-нибудь есть совет или объяснение относительно использования стека с этой архитектурой и объяснения, когда увеличивать стек и сколько нужно давать, большое спасибо!

1 Ответ

0 голосов
/ 01 апреля 2019

Некоторые принципы стека:

Стек должен быть выровнен 16 байт перед вызовом функции, в соответствии с обоими основными соглашениями о вызовах, включая системный ABI x86-64, используемый в MacOS. Если это не так, вы рискуете ошибкой сегментации при вызове внешних функций. (Поскольку им разрешено принимать выравнивание и использовать movaps для 16-байтовых копий в / из стековой памяти, например.)

Интересный факт - на MacOS системные вызовы работают правильно, когда стек не выровнен на 16 байтов.

Для push rax значение rax помещается поверх стека.
Для sub rsp,8 вершина стека остается неизменной (поэтому все, что там находилось в памяти, останется там). Изменение значения rsp равно точно так же для обеих инструкций.

Так, например, вы можете сделать либо:

sub rsp,16

или

push rax
push rax

И указатель стека rsp будет указывать точно на то же место.


Для перемещения указателя стека только на 8, фиктивный push или pop может быть столь же эффективным или более эффективным, чем add/sub. Кроме того, обычно нет.

...