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

7
我正在学习Windows上的x64汇编语言,这是出于兴趣。根据Windows x64调用约定的MSDN文档所述:
调用者负责为被调用方分配参数空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用方没有那么多参数。这有助于支持C未经声明的函数和变参的C/C++函数的简单性。
由于我的函数不是C未经声明的函数或变参的C/C++函数,这是否意味着我可以始终在我的函数中使用[ rsp+8 ]到[ rsp+32 ](假设在调用后rsp的值未修改)作为通用存储空间,例如用于本地变量?
2个回答

6
是的,您可以将入站参数临时空间用于任何目的。但是您已经知道这一点:修改入站参数的合法性已经暗示了允许这样做的权限。
void somefunction(int arg1)
{
    arg1 = anyvalue; // mov [rsp+8], anyvalue
}

感谢您清晰的回答。然而,修改传入参数应该是mov rcx, anyvalue,因为参数是通过rcx传递的,这就是为什么我对[rsp+8]感到不确定的原因。 - Trillian
3
但是你也被允许泄露传入的参数。毕竟这就是保留空间存在的原因。void somefunction(int arg1) { /* 泄露:mov [rsp+8], rcx */ arg1 = anyvalue; /* mov [rsp+8], anyvalue */ } - Raymond Chen

1

我认为他想要做的是类似于这样:

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

据我所知,微软公司表示,即使在只有一个参数(在rcx中)的函数中,您也需要为被调用者分配足够的空间来存储四个寄存器(rcx、rdx、r8、r9)。
注意:对于丑陋的C代码和新的decltype关键字混合使用的老式转换,我感到很抱歉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接