I'm learning x64 assembly on Windows for 'fun'. The MSDN documentation for the x64 calling convention on Windows says:
The caller is responsible for allocating space for parameters to the callee, and must always allocate sufficient space for the 4 register parameters, even if the callee doesn’t have that many parameters. This aids in the simplicity of supporting C unprototyped functions, and vararg C/C++ functions.
As my functions are not C unprototyped functions or varargs C/C++ functions, does this mean I can always use [rsp+8]
to [rsp+32]
(assuming an unmodified value of rsp
right after a call) for general purpose storage within my function, like for local variables?
Yes, you can use inbound parameter scratch space for any purpose. But you knew this already: Permission to do this is already implied by the legality of modifying inbound parameters.
void somefunction(int arg1)
{
arg1 = anyvalue; // mov [rsp+8], anyvalue
}