fastcall: что происходит со стеком?
В настоящее время я изучаю сборку x64 самостоятельно и не могу понять, что происходит со стеком при вызове процедуры сборки из C++.
Из того, что я в настоящее время понимаю из MSDN и Intel, первые 4 параметра целых чисел / с плавающей запятой хранятся в регистрах rcx/xmm0, rdx/xmm1, r8/xmm2 и r9/xmm3, а все остальные будут помещены в стек.
Я просто не понимаю, почему мне нужно получить доступ к 5-му параметру 40 байтов из rsp [rsp+28h] вместо просто 8, поскольку первые 32 байта доступны в регистрах.
Может кто-нибудь объяснить мне, что на самом деле происходит?
Спасибо.
1 ответ
Ключ в этой фразе из связанного MSDN:
Двоичный интерфейс приложения x64 (ABI) - это соглашение о быстрых вызовах из 4 регистров с поддержкой стека для этих регистров.
То есть регистры загружаются с первыми 4 аргументами, но, тем не менее, у них зарезервировано место в стеке. Как отмечает @HansPassant в комментариях ниже, вызывающая сторона не записывает в это теневое пространство, но она доступна для вызываемой стороны, если ей необходимо сохранить регистры (например, для вызова другой функции).