__RTC_CheckEsp实现原理

01371563  mov         esi,esp
01371565  push        offset string "pause" (1377804h)
0137156A  call        dword ptr [__imp__system (137A3F4h)]
01371570  add         esp,4
01371573  cmp         esi,esp
01371575  call        @ILT+420(__RTC_CheckEsp) (13711A9h)

 

在调用system("pause")之前,将esp的值赋值给esi,调用结束后,比较esi和esp是否相等。

__RTC_CheckEsp的代码如下:

_RTC_CheckEsp:
01371F90  jne         esperror (1371F93h)
01371F92  ret  

当esi和esp不相等的时候,跳转到esperror处,否则就直接返回函数。esperror调用了__RTC_Failure

 

esperror:
01371F93  push        ebp  
01371F94  mov         ebp,esp
01371F96  sub         esp,0
01371F99  push        eax  
01371F9A  push        edx  
01371F9B  push        ebx  
01371F9C  push        esi  
01371F9D  push        edi  
01371F9E  mov         eax,dword ptr [ebp+4]
01371FA1  push        0    
01371FA3  push        eax  
01371FA4  call        _RTC_Failure (1371226h)
01371FA9  add         esp,8
01371FAC  pop         edi  
01371FAD  pop         esi  
01371FAE  pop         ebx  
01371FAF  pop         edx  
01371FB0  pop         eax  
01371FB1  mov         esp,ebp
01371FB3  pop         ebp  
01371FB4  ret             

__RTC_Failure打印出错信息。failwithmessage,应该就是打印错误信息。

_RTC_Failure:
01372830  mov         edi,edi
01372832  push        ebp  
01372833  mov         ebp,esp
01372835  mov         eax,dword ptr [errnum]
01372838  cmp         eax,4
0137283B  ja          _RTC_Failure+31h (1372861h)
0137283D  mov         ecx,dword ptr _RTC_ErrorLevels (137900Ch)[eax*4]
01372844  mov         edx,dword ptr _RTC_ErrorMessages (1377C0Ch)[eax*4]
0137284B  cmp         ecx,0FFFFFFFFh
0137284E  je          _RTC_Failure+2Fh (137285Fh)
01372850  push        edx  
01372851  push        eax  
01372852  mov         eax,dword ptr [retaddr]
01372855  push        ecx  
01372856  push        eax  
01372857  call        failwithmessage (13728A0h)
0137285C  add         esp,10h
0137285F  pop         ebp  
01372860  ret

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值