7

我正在 Windows 上学习 x64 程序集以获得“乐趣”。Windows 上 x64 调用约定的MSDN 文档说:

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

由于我的函数不是 C 非原型函数或可变参数 C/C++ 函数,这是否意味着我总是可以使用[rsp+8]to [rsp+32](假设调用后立即未修改的值rsp)在我的函数中进行通用存储,例如局部变量?

4

2 回答 2

6

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

void somefunction(int arg1)
{
    arg1 = anyvalue; // mov [rsp+8], anyvalue
}
于 2011-08-21T13:48:39.463 回答
1

我认为他正在尝试做的更像是这样的:

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

据我了解,微软声明您需要为被调用者分配足够的空间来存储四个寄存器(rcx、rdx、r8.r9),即使在一个只接受一个参数的函数中(在 rcx 中)也是如此。

注意:我很抱歉丑陋的 c 代码和老式的转换与新的 decltype 关键字混合

于 2012-06-09T16:02:57.467 回答