函数栈桢的建立、初始化及清除
本文目的在于描述函数栈桢的建立初始化和清除等过程,因此只对寄存器、汇编指令做一些简单的介绍。
一、一些寄存器的基本介绍(x86处理器中)
图中通用寄存器中:
EAX 通常用于计算,作为累加器。
EBX
ECX 通常用于循环变量计数,作为计数器。
EDX
ESI 通常在内存操作指令中作为“源地址指针”使用。
EDI 通常在内存操作指令中作为“目的地址指针”使用
图中指针寄存器中:
EBP 基址指针,用于指示子程序或者函数调用的基址指针。
ESP 栈指针,用于指示栈顶的位置。
二、一些简单汇编指令介绍(x86汇编)
数据传送指令:
mov 将第二个操作数复制到第一个操作数
push 入栈,将操作数压入内存的栈中,将ESP的值减4
pop 出栈,首先将ESP指示的地址的内容出栈,然后将ESP的值加4
lea 载入有效地址的指令,将第二个操作数的地址载入到第一个操作数
算数和逻辑指令:
sub 将第一个操作数减去第二个操作数,并将相减后的值保存在第一个操作数。
xor 逻辑异或,常用来对寄存器的值清0。
控制转移指令:
ret 弹出栈中保存的指令地址,然后无条件转移到保存的指令地址执行。
rep stos rep的目的是重复之前的一条指令,该指令之前的ecx是重复的次数。stos的作用是将eax的值拷贝到该指令操作数所指的位置。
三、一个空函数栈桢的建立、初始化及清除
测试代码:
int main( )
{
return 0;
}
反汇编代码及解释:
参考:x86汇编快速入门 http://www.cnblogs.com/YukiJohnson/archive/2012/10/27/2741836.html
简明x86汇编 http://blog.csdn.net/feijj2002_/article/details/1597937
函数调用堆栈 http://blog.csdn.net/zhanglianpin/article/details/6310873