为什么 x86 汇编中的第一个参数从偏移量 8 开始?

Why does first parameter in x86 assembly starts from offset 8?

我正在尝试加深对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前 EBP,而不是将堆栈指针值复制到 EBP。第一个(也是唯一一个)函数参数由 EBP + 8 访问。但为什么是8? pushed之后的下一个值EBP逻辑上偏移4。看了很多网页,但是好像没看懂这部分

"missing" DWORD 是 return 地址。调用堆栈如下所示:

ebp     : saved ebp
ebp + 4 : return address
ebp + 8 : pushed parameter

然后如果函数使用局部变量,由于堆栈 space 是(通常)为堆栈帧之后的变量保留的,因此它们被引用为 ebp - xx:

ebp - 8 : second local
ebp - 4 : first local
ebp     : saved ebp
ebp + 4 : return address
ebp + 8 : pushed parameter