Mo cuishle

导航

汇编中的call和ret

反汇编经常看到的CALL指令的基本格式如下:
CALL   地址1

功能:调用地址1处的子程序

 

CALL指令分为两种情况,一种是段内转移;另一种是段间转移。(这里的“段”指PE文件的.text,.data映射在内存中以虚拟地址的方式呈现)

在CALL指令进行的是段内转移的情况时,跟在CALL后面的地址1为一个相对位移;而CALL指令进行的是段间转移的情况时,跟在CALL后面的地址1为一个绝对内存地址。

 

 

段内转移的CALL指令等价于两条指令:
  push eip
  jmp   目的位置

RETN指令用于从段内转移CALL进的子程序中返回:

  RETN   操作数  

 (等价于一条指令:POP   eip,然后执行ESP=ESP+操作数

 

段间转移的CALL指令等价于三条指令:
  push CS
  push eip
  jmp   目的位置

RETF指令用于从段间转移CALL进的子程序中返回:

  RETF   操作数  

 (等价于两条指令:POP   eip
          POP   CS ,然后执行ESP=ESP+操作数 )
  

posted on 2013-11-06 17:31  Mo cuishle  阅读(846)  评论(0编辑  收藏  举报