标签:
call指令:
1)将eip中的下一条指令的地址A保存在栈顶;
2)设置eip指向被调用程序的代码处。
ret指令:将地址A恢复到eip中
这样就将函数的调用变为顺序执行的指令流。
初始堆栈
1)call xxx(函数),执行call时, cs : eip原来的值指向call下一条指令,该值被保存到栈顶,然后cs : eip的值,指向xxx的入口地址。
cs:eip被压栈
2)进入xxx
第一条指令: pushl %ebp
上级函数的基地址压栈
第二条指令: movl %esp, %ebp
在原来堆栈的地址空间,创建了新的函数调用堆栈
函数体中的常规操作,可能会压栈、出栈
3)退出xxx
movl %ebp,%esp
popl %ebp
执行此命令后ebp指向原来的地址
ret
cs:eip出栈
标签:
原文地址:http://www.cnblogs.com/boyiliushui/p/5406060.html