我读过 Microsoft's documentation ,但是这个方案太尴尬了,我想我会仔细检查以确保我理解正确......
我的理解是传递参数的通用方法是这样的:
--- 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) 先压入,因此它最靠近栈底。
关于windows - x64 调用约定(堆栈)和可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083810/