【问题标题】:Why does first parameter in x86 assembly starts from offset 8?为什么 x86 汇编中的第一个参数从偏移量 8 开始?
【发布时间】:2024-01-23 14:32:01
【问题描述】:

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

【问题讨论】:

    标签: assembly x86 stdcall


    【解决方案1】:

    “缺失”的 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 中提取局部变量,这些变量在参数和返回地址之后被推送。
    最近更新 更多