x64调用约定(堆栈)和varargs



我看过微软的文档,但这个方案太尴尬了,我想我应该仔细检查一下,以确保我正确理解它。。。

我的理解是,传递参数的通用方法是:

--- 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)是先推的,所以它最接近堆栈的底部。

最新更新