ESP
ESP(Extended stack pointer)是指针寄存器的一种(另一种为EBP)。用于堆栈指针。
ESP为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部),而EBP为帧指针,指向当前活动记录的顶部。
栈指针与帧指针标识出了当前活动记录的位置。
当函数被调用的时候,执行如下操作:
⒈将帧指针压入栈中:push ebp
⒉用ebp保存当前栈指针:mov ebp,esp
⒊使得栈指针自减,自减得到的内存应当能够被用来存储被调用函数的本地状态:sub 0CCh,esp
EBP
每个任务(进程)有一个栈,在这个进程中每个函数被调用时分别从这个栈占用一段区域,称为帧(frame)。%esp寄存器指向当前整个栈的栈顶,% ebp指向当前帧的帧底。上一级调用者的帧底被压入当前%ebp内容所指的地址,也就是当前帧的帧底位置保存了上一级调用者的%ebp指针值(帧底),而每个%ebp的前一个单元存放的就是当前函数的返回地址(它是由调用者在call指令中入的栈),保证是在上以及帧的最后一个空间单元。这样就可以 根据当前%ebp的值回溯出整个任务的调用栈(调用过程)。
在函数栈帧中,一般包含以下几类重要信息。 (1)局部变量:为函数局部变量开辟的内存空间。 (2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过栈帧平衡计 算得到),用于在本栈被弹出后恢复出上一个栈帧。 (3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回 时能够恢复到函数被调用前的代码区中继续执行指令。
注:函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。函数运行过程中,其栈帧大小也是 在不停变化的。 除了与栈相关的寄存器外,我们还需要记住另一个至关重要的寄存器。 EIP:指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待 执行的指令地址。 可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。