Assembly 为什么x86程序集中的第一个参数从偏移量8开始?

Assembly 为什么x86程序集中的第一个参数从偏移量8开始?,assembly,x86,stdcall,Assembly,X86,Stdcall,我正在努力发展对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前的EBP,然后将堆栈指针值复制到EBP。第一个(也是唯一一个)功能参数由EBP+8访问。但为什么是8?按下EBP后的下一个值逻辑上为偏移量4。我读了很多网页,但似乎我不明白这一部分。缺少的DWORD是回信地址。调用堆栈如下所示: ebp : saved ebp ebp + 4 : return address ebp + 8 : pushed parameter 然后,如果函数使用局部变量,因为堆栈空间(通常)是为堆

我正在努力发展对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前的
EBP
,然后将堆栈指针值复制到
EBP
。第一个(也是唯一一个)功能参数由
EBP+8
访问。但为什么是8?按下EBP后的下一个值逻辑上为偏移量4。我读了很多网页,但似乎我不明白这一部分。

缺少的DWORD是回信地址。调用堆栈如下所示:

ebp     : saved ebp
ebp + 4 : return address
ebp + 8 : pushed parameter
然后,如果函数使用局部变量,因为堆栈空间(通常)是为堆栈帧之后的变量保留的,它们被引用为
ebp-xx

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

非常感谢。我把重点放在了错误的部分(阅读了关于调用约定的内容,但忘记了基本的事情)值得一提的是,这个问题中的堆栈向下增长,这就是为什么您要从ebp中提取局部变量,这些变量是在参数和返回地址之后推送的。