windows 32位汇编的环境下
0A10FF61 call 0A11FFAA
0A10FF66 MOV EAX,DWORD PTR SS:[EBP+3C]
- 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 //还原函数栈