только что начали изучать сборку X64, и у меня возникли вопрос о функциях, аргументах и стеке. Насколько я понимаю, первые четыре аргумента в функции передаются в RCX, RDX, R8 и R9 регистры (и XMM0-XMM3 для поплавков) в Windows. Таким образом, функция тривиальной добавления с четырьмя параметрами будет выглядеть следующим образом:
add:
mov r10, rcx
add r10, rdx
add r10, r8
add r10, r9
mov rax, r10
ret
Тем не менее, я сталкивался со документацией, которая упоминает это :
как минимум, каждая функция должна резервировать 32 байта (четыре 64 -битные значения) на стеке. Это пространство позволяет регионам передаваться в функцию, которая будет легко скопирована в хорошо известное местоположение стека. Функция CALLEE не требуется пролить файлы входных записей в стек, но бронирование пространства стека гарантирует, что он может при необходимости.
Итак, мне приходится забронировать пространство стека, даже если функции, которые я делаю, принимаю четыре параметра или меньше, или это просто рекомендация?