Вход-выход из программы архитектуры x86-64 (проблема выравнивания стека)

Возник такой вопрос - нужно обеспечить выравнивание стека для x64 программ. Так получается надо. Ну окей. Собеседник предложил сразу вариант:

start: push rax;

Второй раз окей и без проблем. Потом, последующее общение с ИИ выявило, что хорошо бы было сделать чуть более:

start:
push rax; Выравниваем стек на 16 байт
; Ваш код
pop rax; Восстанавливаем значение rax (если нужно)
; Тут код завершение программы

И тут возникла дилемма, на сколько нужен и важен этот pop rax. По моему разумению - если программа завершается, память по-любому освободится же? Но есть одно "но"!!! Как отработает "код завершения" правильно? Нужен ему этот pop rax; "впереди" или нет.

Пожалуйста, помогите ответом, ну или край - советом!


Ответы (1 шт):

Автор решения: Intelligent Shade of Blue

Да, система освободит ресурсы при выходе программы. Но так как вы не указали что делает "Ваш код" и "Тут код завершение программы", нельзя сказать однозначно.

Если ваш код завершения программы это просто:

mov rax, 60
mov rdi, 0
syscall

то естественно это не нужно.

Если ваш код завершения успользует указатель стека, то это будет зависеть от вашего кода.

С другoй стороны, если вы в будущем решите refactor вашу программу на что-то вроде:

foo:
  push rax; Выравниваем стек на 16 байт
  ; Ваш код
  pop rax; Восстанавливаем значение rax (если нужно)
  ret

start:
  call foo
  ; Тут код завершение программы

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

→ Ссылка