EBP寄存器(基帧指针)仅适用于x86中的调试吗?

Cat*_*oes 15 debugging x86 assembly memory-management

学习x86程序集和框架指针让我大吃一惊.我从这个问题中了解到,EBP使调试生活变得非常棒.这很好,但我很好奇,"EBP还用了什么呢?" 查看调用堆栈维基百科文章,EBP是动态堆栈分配所必需的.

因为我一直假设动态分配在堆上.那么,为什么我要使用动态堆栈分配 - 为什么堆不够好呢?而且,EBP如何对此有用?

Gun*_*iez 20

你错误地认为ebp堆栈帧分配是必要的.这不是真的,esp可以直接使用.现在使用ebp作为堆栈帧指针是绝对必要的.有几点,哪里有用:

  • 在16位代码中,sp(寻址中的堆栈指针)的使用受到严格限制,在x86中根本不可能直接进行相对寻址,其中bp可以在可用的每种寻址模式中使用.

  • 这种有限支持的原因可能是当时可用的编译器,使用帧指针生成代码然后跟踪不断变化的代码要简单得多sp.还有更多的处理器对堆栈帧指令有特殊的支持,比如leave或者enter,但AFAIK除了英特尔之外别无其他人sp在这个过程中瘫痪真实:-)

  • 调试.当帧指针可用时,展开堆栈要容易得多,但现代调试器甚至可以做到.

如果你想在栈上分配100字节的空间,只是sub esp, #100,访问与空间move [esp + x],其中x0到99之间是与清理add esp, #100和你做.我甚至认为在手工编写的程序集中使用堆栈帧指针就像复制三十年前编译器的行为,当编译器真的很愚蠢而且离不开时.这是在没有办法必要,也有用的,如果你正在写汇编.


GJ.*_*GJ. 9

与堆分配相比,从堆栈分配少量内存非常快.当我们从堆分配内存时,我们必须调用API或内存管理器.

是的,您也可以将EBP寄存器用于任何其他目的,例如其他32位寄存器,但您必须先将其内容存储在恢复之后,然后再退出程序.

您可以使用PUSH EBP将EBP内容存储到堆栈并POP EBP进行还原.

  • 严格地说,在非16位模式中,"EBP/RBP" - 堆栈内容的相对寻址不是必需的,因为"ESP/RSP"相对寻址是可用的.有些编译器甚至可以选择抑制`EBP/RBP`-相对寻址的生成,而使用`ESP/RSP`相对(例如gcc中的`-fomit-frame-pointer`). (6认同)
  • `-fomit-frame-pointer`是当今许多架构的默认设置.使用`ebp`作为标准寄存器是很常见的.即使没有`ebp`作为帧指针,现代调试器也支持堆栈展开,因此调试时不需要它. (6认同)