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 в комментариях ниже, вызывающая сторона не записывает в это теневое пространство, но она доступна для вызываемой стороны, если ей необходимо сохранить регистры (например, для вызова другой функции).

Другие вопросы по тегам