堆栈相关的寄存器
esp
: 堆栈指针(stack pointer)
ebp
: 基制指针(base pointer)
堆栈操作
push
栈顶地址减少4个字节(32位)pop
栈顶地址增加4个字节
ebp
在C语言中用作记录当前函数
调用基址
其它关键寄存器
cs:eip
:总是指向下一条的指令地址- 顺序执行: 总是指向地址连续的下一条指令
- 跳转/分支:执行这样的指令的时候,
cs:eip
的值会根据程序需要被修改 call
:将当前cs:eip
的值压入栈顶,cs:eip
指向被调用函数的入口地址ret
从栈顶弹出原来保存在这里的cs:eip
的值,放入cs:eip
中- 发生中断时
函数调用堆栈的框架
call
指令的执行过程:
- 将
eip
中下一条指令的地址A保存在栈顶 - 设置
eip
指向被调用程序代码开始处
调用过程
执行了call指令后,堆栈可能是这样的:
接着执行
pushl %ebp
将ebp
压入堆栈:
之后执行
movl %esp,%ebp
此时esp
和ebp
都指向了同一个位置,相当于创建了一个新的空堆栈。
接着就是函数内部的操作了,可能有一些压栈出栈的操作:
退出函数:
movl %ebp,%esp
实际上把栈清空:
再执行一条指令
popl %ebp
此时栈又回到了原来的状态:
最后执行:
ret
这个函数调用的流程就结束了。