美文网首页
栈和函数

栈和函数

作者: xXPzXj | 来源:发表于2016-08-17 20:10 被阅读34次

没有栈就没有函数,没有局部变量,传统上其是一个特殊的容器,用户将数据压入栈中,也可以将数据弹出,遵循先入后出的原则。

也就是说是一个动态的内存区域,压栈增大了栈,出栈减少了栈。

通常esp寄存器定位栈顶部,压栈使得栈顶地址变小,弹出反之增大,因为从高地址开始。

减少esp等于在栈上开辟空间,反之就是回收空间。

栈在程序运行时,保存了函数所需要的维护信息,也就是堆栈帧,或者说活动记录,里面包含了函数的返回地址和参数,临时变量,包括非静态的局部变量,和编译器自动生成的其他临时变量。还保存了上下文,还由函数调用前后需要保持不变的寄存器。

一般就是esp和ebp两个寄存器,esp指向栈顶部,ebp指向了函数活动记录的一个固定的位置,也叫做帧指针。

一般来说一个函数的汇编代码开头应该是:

push ebp;把ebp(old ebp)压入栈

move ebp ,esp;这时候ebp指向栈顶,这时候栈顶是old ebp,也就是保存了旧的栈顶置针

返回的时候再把ebp给esp,从而获得初始入栈的时候的函数信息。

一些函数前几个字节会预留一些空字节,这样就可以动态的插入一个jmp指令,从而跳转到另外一个函数,那么我们就可实现一个简单hook

相关文章

  • 栈和函数

    没有栈就没有函数,没有局部变量,传统上其是一个特殊的容器,用户将数据压入栈中,也可以将数据弹出,遵循先入后出的原则...

  • 宏、普通函数、内联函数之间的区别

    普通函数 调用时向栈中push函数帧,调用结束后pop函数帧。编译器会在函数调用语句的前后,插入入栈和出栈的辅助代...

  • JavaScript中事件循环机制

    事件循环机制: 在执行上下文的过程中,对函数的入栈和出栈。执行前函数入栈,执行后函数出栈。如若遇到了一些异步...

  • 数组

    一. 栈和堆 栈:当一个函数调用时,会在栈内存中申请一个空间,当函数中定义一个变量时,会分配到这个函数申请的栈空间...

  • 2. 进程栈和线程栈

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈 - 木易博客专栏 - CSDN博客 栈的作用:函数调用和多...

  • 【iOS内功】ARM黑魔法—栈桢的入栈和出栈

    栈桢之谜 调用一个子函数,在内存上会入一个新的栈桢。子函数执行完了,当前栈桢会出栈。在运行时,栈桢的出栈和入栈的逻...

  • 巧用函数栈实现栈的反转

    一、函数栈 函数的调用过程其实就是一个压栈的过程,在函数栈中,每个函数所占空间成为一个 栈帧。栈帧中保存着函数的形...

  • Tips:inline 与force_inline

    前期准备 函数入栈和出栈 函数每次入栈都会调用call指令,调用后还需要出栈返回到原来调用的地方。这个时间开销实际...

  • 函数调用栈平衡

    栈平衡 栈平衡:函数调用前后的栈顶指针指向的位置不变 内平栈 外平栈 内平栈: 指的是在函数调用返回之前使栈保持...

  • 如何仅用递归函数和栈操作逆序一个栈

    3.如何仅用递归函数和栈操作逆序一个栈 题目: 解题:

网友评论

      本文标题:栈和函数

      本文链接:https://www.haomeiwen.com/subject/crbmsttx.html