我正在学习Windows上的x64汇编语言,这是出于兴趣。根据Windows x64调用约定的MSDN文档所述:
调用者负责为被调用方分配参数空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用方没有那么多参数。这有助于支持C未经声明的函数和变参的C/C++函数的简单性。
由于我的函数不是C未经声明的函数或变参的C/C++函数,这是否意味着我可以始终在我的函数中使用[ rsp+8 ]到[ rsp+32 ](假设在调用后rsp的值未修改)作为通用存储空间,例如用于本地变量?
调用者负责为被调用方分配参数空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用方没有那么多参数。这有助于支持C未经声明的函数和变参的C/C++函数的简单性。
由于我的函数不是C未经声明的函数或变参的C/C++函数,这是否意味着我可以始终在我的函数中使用[ rsp+8 ]到[ rsp+32 ](假设在调用后rsp的值未修改)作为通用存储空间,例如用于本地变量?
mov rcx, anyvalue
,因为参数是通过rcx
传递的,这就是为什么我对[rsp+8]
感到不确定的原因。 - Trillianvoid somefunction(int arg1) { /* 泄露:mov [rsp+8], rcx */ arg1 = anyvalue; /* mov [rsp+8], anyvalue */ }
- Raymond Chen