我已经阅读了微软的文档 ,但是这个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)被首先推入,所以它最靠近堆栈的底部。