2011-08-21 20 views
7

我正在学习Windows上的x64程序集以获得“乐趣”。该MSDN documentation for the x64 calling convention on Windows说:在Win64 ABI中,保留的参数堆栈空间是否可用于通用存储?

调用者负责为参数到被叫分配空间,必须始终分配足够的空间为4个寄存器参数,即使被叫方不具有如此之多的参数。这有助于支持C unprototyped函数和vararg C/C++函数的简单性。

由于我的功能不是C unprototyped功能或可变参数C/C++函数,这意味着什么我可以随时我的函数内使用[rsp+8][rsp+32](假设rsp未修饰的值的调用后右)通用存储,像局部变量一样?

回答

6

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

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

感谢您的明确答案。但是,由于参数是通过'rcx'传递的,所以修改入站参数应该是'mov rcx,anyvalue',这就是为什么我不确定'[rsp + 8]'。 – Trillian

+3

但你也被允许泄漏入站参数。毕竟,这就是为什么预留的空间在那里。 'void somefunction(int arg1){/ * spill:mov [rsp + 8],rcx */arg1 = anyvalue;/* mov [rsp + 8],anyvalue * /}' –

1

我想他正试图做的是更多这样的事情:

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

据我了解,微软表示你需要为被叫方存储四个分配足够的空间寄存器(rcx,rdx,r8,r9),即使在只有一个参数的函数中(在rcx中)也是如此。

注意:对于丑陋的c代码和混合了新decltype关键字的旧学校演员表抱歉

相关问题