反汇编经常看到的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+操作数 )