汇编ESP、EBP的理解

1、ESP 栈顶指针。用于指向栈的栈顶(下一个压入栈的活动记录的顶部)。

   理解:当栈为空的时候,ESP指向的是顶部。esp = 0xFFFF。pop入栈之后的esp = 0xFFFF - 0x04 

2、EBP:帧指针,指向当前活动记录的顶部。通常用于访问局部变量

3、Call:子程序调用指令。call 指令执行时,会先将EIP压入堆栈,保存子程序的返回地址。


eg:

function proc data_1, data_2
push ebp
mov ebp,esp
mov eax, [ebp+0x08]
mov ebx, [ebp+0x0c]


push 0x05
push 0x07
call function


第一次push 之后,esp + 4

第二次push 之后,esp + 8

call 调用之后,esp + 0x0C

进入子程序之后,push ebp 之后 esp + 0x10 。再执行mov ead, [ebp+0x08]的时候,过程如下

        可以理解为 :先去ebp + 0x08的地址取出一个字节的数据,然后再去ebp + 0x09 取出一字节数据。。。。。依此类推直至去玩四字节。

        但是mov 指令实际的执行状态为直接去取四字节的数据。

mov eax, [esp] 中 esp 指向的下一个将要入栈的地址。而mov 指令会将当前地址以及紧邻的高四字节的地址数据取出。放入eax 中。


以上完全是个人为了帮助理解堆栈平衡而写,没有关注语法、逻辑上得错误。


        








你可能感兴趣的:(汇编ESP、EBP的理解)