Agenda C语言函数调用堆栈框架 函数指针与回调函数 堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 函数调用框架 传递参数 保存返回地址 提供局部变量空间 等等 C语言编译器对堆栈的使用有一套的规则 了解堆栈存在的目的和编译器对堆栈使用的规则是理解操作系统,特殊应用,代码注入等一些关键性代码的基础。 堆栈寄存器和堆栈操作 堆栈相关的寄存器 esp,堆栈指针(stack pointer) ebp,基址指针(base pointer) 堆栈操作 push栈顶地址减少4个字节(32位) pop栈顶地址增加4个字节 ebp在C语言中记录当前函数调用基址 esp ebp 高地址 低地址 esp 利用堆栈实现函数调用和返回 其他关键寄存器 cs : eip:总是指向下一条的指令地址 顺序执行:总是指向地址连续的下一条指令 跳转/分支:执行这样的指令的时候,cs : eip的值会根据程序需要被修改 call:将当前cs : eip的值压入栈顶,cs : eip指向被调用函数的入口地址 ret:从栈顶弹出原来保存在这里的cs : eip的值,放入cs : eip中 函数的堆栈框架 // 调用者 … call target … //建立被调用者target函数堆栈框架pushl %ebpmovl %esp, %ebp //拆除被调用者函数的堆栈框架movl %
原创力文档

文档评论(0)