В Win64 ABI может ли зарезервированное пространство стека аргументов использоваться для хранения общего назначения? - PullRequest
7 голосов
/ 21 августа 2011

Я изучаю сборку x64 в Windows для развлечения.Документация MSDN для соглашения о вызовах x64 в Windows гласит:

Вызывающая сторона отвечает за выделение места для параметров вызываемой стороне и всегда должна выделять достаточно места для регистра 4.параметры, даже если вызываемый не имеет столько параметров.Это помогает в простоте поддержки функций, не являющихся прототипами C, и функций vararg C / C ++.

Поскольку мои функции не являются функциями, не являющимися прототипами C, или функциями varargs C / C ++, это означает, что я всегда могу использоватьОт 1009 * до [rsp+32] (при условии неизмененного значения rsp сразу после вызова) для хранения общего назначения в моей функции, например для локальных переменных?

Ответы [ 2 ]

6 голосов
/ 21 августа 2011

Да, вы можете использовать пустое пространство для входящих параметров для любых целей.Но вы уже знали это: разрешение на это уже подразумевается законностью изменения входящих параметров.

void somefunction(int arg1)
{
    arg1 = anyvalue; // mov [rsp+8], anyvalue
}
1 голос
/ 09 июня 2012

Я думаю, что он пытается сделать что-то вроде этого:

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue

Насколько я понимаю, Microsoft заявляет, что вам необходимо выделить достаточно места для вызываемой стороны для хранения четырех регистров (rcx, rdx, r8. r9), даже в функции, которая принимает только один аргумент (в rcx).

Примечание: извините за уродливый код c и кастинг старой школы, смешанный с новымключевое слово decltype

...