В этом ответе Ошибка сегментации в printf — NASM 64bit Linux первый автор говорит, что когда я выделяю стек, %rsp должен быть кратен 16 плюс 8, потому что впоследствии вызов функции будет помещать адрес в стек, но в ABI он говорит, что rsp должен быть кратен 16 в записи программы, и Когда я действительно попытался, я обнаружил, что сохранение rsp, кратного 16 плюс 8, вызывает ошибку сегментации, даже когда я потом вызываю printf@PLT, но сохранение кратности 16 работает. Итак, что мне делать для rsp при распределении стека?
But In ABI ,it says rsp must be multiple of 16 in program entry
_start
не является функцией. Ничем не call
ед, в стеке нет адреса возврата (только argc
и собственно массивы argv[]
и envp[]
).
Да, для записи обработать RSP уже выровнен по 16 байтам и готов к вызову функции.
Я снова отредактировал ответ Шута на вопрос, который вы связали, чтобы уточнить его.
Выровненный по 16 байт до a call
является требованием. Вы вернетесь к этому со смещением 16 * n + 8
внутри вашей функции перед другим вызовом, включая любые push
es.