x64调用约定(堆栈)和可变参数

我已经阅读了微软的文档 ,但是这个scheme太尴尬了,我想我会仔细检查一下,以确保正确理解它。

我的理解是参数通过的通用方法是:

--- bottom of stack --- (return address) [shadow space for arg 1] [shadow space for arg 2] [shadow space for arg 3] [shadow space for arg 4] arg N arg N - 1 arg N - 2 ... arg 6 arg 5 ---- top of stack ----- 

实现va_arg时,这似乎很尴尬,这样的…这实际上是正确的吗?

正确的图是

 --- Bottom of stack --- RSP + size (higher addresses) arg N arg N - 1 arg N - 2 ... arg 6 arg 5 [shadow space for arg 4] [shadow space for arg 3] [shadow space for arg 2] [shadow space for arg 1] (return address) ---- Top of stack ----- RSP (lower addresses) [grows downward] 

返回地址位于堆栈顶部(最近被推送),接着是前四个参数的影子空间,后面是参数5和之后的地方。

参数被从右向左推:最后一个参数(N)被首先推入,所以它最靠近堆栈的底部。