为什么 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
我正在尝试加深对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前 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