【发布时间】:2024-01-23 14:32:01
【问题描述】:
我正在努力加深对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前的EBP,而不是将堆栈指针值复制到EBP。第一个(也是唯一的)函数参数由EBP + 8 访问。但是为什么是8?推送EBP后的下一个值逻辑上偏移4。我看了很多网页,但似乎我不明白这部分。
【问题讨论】:
我正在努力加深对汇编语言的理解。我知道当函数创建堆栈帧时,它会推送当前的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
【讨论】: