【问题标题】:What is the EBP register pointing to when the main function executes? (Intel x82 architecture)main函数执行时EBP寄存器指向什么? (英特尔 x82 架构)
【发布时间】:2015-05-01 12:20:57
【问题描述】:

我知道在函数调用期间,EBP 寄存器指向被调用函数压入堆栈的第一个值。但是第一次调用main函数时,EBP寄存器指向的是什么?它是主函数压入堆栈的第一个局部变量吗?

【问题讨论】:

  • 其实,如果ebp作为帧指针,它通常指向oldebp,因为正常的函数入口代码是push ebp; mov ebp, esp

标签: c assembly x86 calling-convention


【解决方案1】:

输入函数时ebp指向的位置未定义。函数序言(它是函数的一部分)使ebp 指向堆栈帧,尽管如果不需要序言,可以省略它,或者可以对ebp 做任何其他事情,只要它在返回时恢复值即可。 main 在这方面没有什么不同。

【讨论】:

    【解决方案2】:

    main()之前的ebp的值是操作系统初始化的,所以需要说明你使用的是什么操作系统。

    说到Linux和libc,在main()之前有一个函数叫做_start。但是在_start之前,ebpesp的位置是由Linux内核在分配栈时决定的。而且,大多数时候,为了实现 ASLR(地址空间布局随机化),会将默认值添加到偏移量。

    【讨论】:

    • 初始 ebp 在 ABI 中未定义,但 linux 内核将其设置为零。
    • @Jester:它在 ABI 中未定义,但在 main() 运行时肯定不会。否则你会有一个真正的问题......
    • 即使在进入main 时它也是未定义的,不,这不会造成问题,因为任何需要帧指针的函数都必须为自己设置它。请参阅@StenSoft 的回答。
    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2013-07-20
    相关资源
    最近更新 更多