栈和函数

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

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

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

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

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

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

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,734评论 1 19
  • 栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函...
    zjfclimin阅读 4,141评论 0 5
  • 首先寄存器使用惯例:eip :指令地址寄存器,保存程序计数器的值,当前执行的指令的下一条指令的地址值,16位中为i...
    扎Zn了老Fe阅读 2,019评论 0 0
  • 堆栈是连续的地址空间,且向低地址端生长。 esp 是堆栈指针ebp 是基址指针那两条指令的意思是将栈顶指向ebp的...
    wyrover阅读 1,147评论 0 1
  • 最近在看神夏。可能是之前看到waston的扮演者在访谈里公然讥讽基本演绎法里的刘玉玲,再加上实在不喜欢他剧中的走路...
    伍伍陆阅读 162评论 0 0