执行retn、call、leave指令的时候,esp和eip的变化情况

windows 32位汇编的环境下

0A10FF61 call      0A11FFAA
0A10FF66 MOV EAX,DWORD PTR SS:[EBP+3C]

  1. call 
           CALL   地址1
      功能:调用地址1处的子程序
      CALL指令分为两种情况,一种是段内转移;另一种是段间转移。这两种情况类似于JMP指令的相对跳转和绝对跳转(只不过相对跳转的JMP指令会有short标识)。
      在CALL指令进行的是段内转移的情况时,跟在CALL后面的地址1为一个相对位移;而CALL指令进行的是段间转移的情况时,跟在CALL后面的地址1为一个绝对内存地址。
      (1)段内转移的CALL指令等价于两条指令:
      push eip
      jmp   目的位置

      也就是说,执行段内转移的CALL指令时,相当于先后执行以上两条指令。
      (2)段间转移的CALL指令等价于三条指令:
      push CS
      push eip
      jmp   目的位置

esp = esp - 4

[esp] = 0A10FF66   //将返回地址压入栈中

 

  eip = 0A11FFAA    //跳转到函数地址
 

 2. retn

 

RETN/RETF是跳出子程序的指令,被称为返回指令。RETN指令用于从段内转移CALL进的子程序中返回;RETF指令用于从段间转移CALL进的子程序中返回。
  RETN/RETF在反汇编代码中呈现的形式如下:
  RETN
  RETN   操作数1
  RETF
  RETF   操作数1
  RETN等价于一条指令:POP   eip
  RETF等价于两条指令:
  POP   eip
  POP   CS

  而带有操作数的RETN/RETF指令则是在POP(ESP+4)之后,执行ESP=ESP+操作数1。

eip = [esp]
esp = esp + 4 //将esp中的数据出栈到eip中,同时ESP+4

  3.  leave

mov esp,ebp
pop ebp //还原函数栈

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值