ESP 和 EBP

首先esp是堆栈指针...........ebp是基址指针...........

.C文件

int Func(int a,int b,int c,int e);


void main()
{
int d = Func(1,2,3,4);
getchar();
}


int Func(int a,int b,int c,int e)
{
return (a+b+c+e);
}


在调试的时候调用函数一般会看到如下形式:

012213B0  push        ebp   ;把ebp入栈用来保存调用函数前的基址指针用于  返回用

012213B1  mov         ebp,esp  ;esp赋给ebp 保存调用函数前的堆栈指针
012213B3  sub         esp,0CCh 
012213B9  push        ebx  
012213BA  push        esi  
012213BB  push        edi  
012213BC  lea         edi,[ebp-0CCh] 
012213C2  mov         ecx,33h  ;计数器
012213C7  mov         eax,0CCCCCCCCh 

012213CC  rep stos    dword ptr es:[edi]  ;用eax寄存器的内容 填充以edi地址开头,以ecx寄存器内容为个数,的内存

;-------------------------------整个的意思就是把堆栈用cc填充--------------------------------------------------

int d = Func(1,2,3,4);
012213CE  push        4    
012213D0  push        3    
012213D2  push        2    
012213D4  push        1    
012213D6  call        @ILT+325(_Func) (122114Ah) 
012213DB  add         esp,10h 

012213DE  mov         dword ptr [d],eax 

...................

01221420  push        ebp  
01221421  mov         ebp,esp 
01221423  sub         esp,0C0h 
01221429  push        ebx  
0122142A  push        esi  
0122142B  push        edi  
0122142C  lea         edi,[ebp-0C0h] 
01221432  mov         ecx,30h 
01221437  mov         eax,0CCCCCCCCh 
0122143C  rep stos    dword ptr es:[edi] 
return (a+b+c+e);
0122143E  mov         eax,dword ptr [a] 
01221441  add         eax,dword ptr [b] 
01221444  add         eax,dword ptr [c] 
01221447  add         eax,dword ptr [e] 
}
0122144A  pop         edi  
0122144B  pop         esi  
0122144C  pop         ebx  
0122144D  mov         esp,ebp 
0122144F  pop         ebp  
01221450  ret      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值