Какой размер я должен поддерживать для% rsp при выделении стека в asm, кратном 16 или кратном 16 плюс 8 - PullRequest
0 голосов
/ 30 мая 2019

В этом ответе Ошибка сегментации в printf - NASM 64bit Linux первый автор говорит, что когда я блокирую стек,% rsp должен оставаться кратным 16 плюс 8, потому что после вызова функции будет помещать адрес в стек, ноВ ABI говорится, что rsp должен быть кратным 16 при входе в программу, и когда я действительно попробую, обнаружил, что rsp, кратный 16 плюс 8, вызывает ошибку сегментации, даже если потом я вызываю printf @ PLT, но держу его кратным 16 работам,Итак, что я должен делать для rsp при выделении стека?

1 Ответ

2 голосов
/ 30 мая 2019

Но в ABI говорится, что rsp должен быть кратным 16 при входе в программу

_start не является функцией. Он не call ничем не редактируется, в стеке нет адреса возврата (только argc и фактические массивы argv[] и envp[] ).

Да, при запись процесса RSP уже выровнен на 16 байтов, готов к вызову функции.


Я снова отредактировал ответ Шута на вопрос, который вы связали, чтобы прояснить его.

16-байтовое выравнивание перед a call является требованием. Вы возвращаетесь к этому со смещением 16 * n + 8 внутри вашей функции перед другим вызовом, включая любые push es.

...