Question

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?

Was it helpful?

Solution

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
}

OTHER TIPS

I think what he is trying to do is more something like this:

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

As far as I understand, Microsoft states that you are required to allocate enough space for the callee to store four registers (rcx, rdx, r8. r9), even in a function that takes only one argument (in rcx).

Note: i'm sorry about the ugly c code and the old-school casting mixed with the new decltype keyword

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top