在Win64 ABI中,保留的参数堆栈空间可以用于通用存储吗?

Tri*_*ian 7 64-bit assembly win64 abi calling-convention

我正在Windows上学习x64汇编以获得"有趣".Windows上x64调用约定MSDN文档说:

调用者负责为被调用者分配参数空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用者没有那么多参数也是如此.这有助于简化支持C非原型函数和vararg C/C++函数.

由于我的功能是不是C unprototyped函数或可变参数的C/C++函数,这是否意味着我可以一直使用[rsp+8][rsp+32](假设未修改的价值rsp我的函数中调用后右)通用存储,如为局部变量?

Ray*_*hen 6

是的,您可以出于任何目的使用入站参数暂存空间.但是你已经知道了这一点:修改入站参数的合法性已经暗示了这样做的许可.

void somefunction(int arg1)
{
    arg1 = anyvalue; // mov [rsp+8], anyvalue
}
Run Code Online (Sandbox Code Playgroud)

  • 但是你也被允许泄漏入站参数.毕竟,这就是保留空间存在的原因.`void somefunction(int arg1){/*spill:mov [rsp + 8],rcx*/arg1 = anyvalue;/*mov [rsp + 8],anyvalue*/}` (3认同)