Вход-выход из программы архитектуры x86-64 (проблема выравнивания стека)
Возник такой вопрос - нужно обеспечить выравнивание стека для x64 программ. Так получается надо. Ну окей. Собеседник предложил сразу вариант:
start: push rax;
Второй раз окей и без проблем. Потом, последующее общение с ИИ выявило, что хорошо бы было сделать чуть более:
start:
push rax; Выравниваем стек на 16 байт
; Ваш код
pop rax; Восстанавливаем значение rax (если нужно)
; Тут код завершение программы
И тут возникла дилемма, на сколько нужен и важен этот pop rax. По моему разумению - если программа завершается, память по-любому освободится же? Но есть одно "но"!!! Как отработает "код завершения" правильно? Нужен ему этот pop rax; "впереди" или нет.
Пожалуйста, помогите ответом, ну или край - советом!
Ответы (1 шт):
Да, система освободит ресурсы при выходе программы. Но так как вы не указали что делает "Ваш код" и "Тут код завершение программы", нельзя сказать однозначно.
Если ваш код завершения программы это просто:
mov rax, 60
mov rdi, 0
syscall
то естественно это не нужно.
Если ваш код завершения успользует указатель стека, то это будет зависеть от вашего кода.
С другoй стороны, если вы в будущем решите refactor вашу программу на что-то вроде:
foo:
push rax; Выравниваем стек на 16 байт
; Ваш код
pop rax; Восстанавливаем значение rax (если нужно)
ret
start:
call foo
; Тут код завершение программы
то без pop rax у вас будет проблема. Поэтому я и посоветовал оставить его, чтобы сохранить себе неприятности в будущем. Да это не нужен. Но это занимает мизирное количество времени чтобы исполнить. Это просто хорошая практика.