普通函数的汇编分析

函数很简单

int sum(int x,int y){

return x+y;

}

int _tmain(int argc, _TCHAR* argv[])

{

     int xx=sum(3,4);

....//省略后面的

}

 

直接上VS转化出来的汇编代码

 

//sum函数部分。。。。
int sum (int x,int y){
004113B0  push        ebp                                //保存调用前的堆栈基址
004113B1  mov         ebp,esp                         //赋值(保存)当前的栈基地址
004113B3  sub         esp,0C0h                       //将栈地址向后跳了192个字节,不知道干什么。。。因为栈是从高地址向地址发展的
004113B9  push        ebx                               //不知道
004113BA  push        esi 
004113BB  push        edi 
004113BC  lea         edi,[ebp-0C0h]
004113C2  mov         ecx,30h
004113C7  mov         eax,0CCCCCCCCh
004113CC  rep stos    dword ptr es:[edi]
    return x+y;
004113CE  mov         eax,dword ptr [x]        //保存当前x的值到eax
004113D1  add         eax,dword ptr [y]         //这里就是x+y的操作啦,没什么好看的
}
004113D4  pop         edi                                //下面3句是把栈里的那3个之前push进去的都pop出来
004113D5  pop         esi 
004113D6  pop         ebx 
004113D7  mov         esp,ebp                       //还原原来堆栈指针

004113D9  pop         ebp                              //重新定位程序基地址
004113DA  ret                                              //返回指令
--- No source file -------------------------------------------------------------

 

 

主函数部分

--- c:/documents and settings/guoge/my documents/visual studio 2005/projects/ckrfile/testdllmain/testdllmain.cpp
int _tmain(int argc, _TCHAR* argv[])
{
004113F0  push        ebp 
004113F1  mov         ebp,esp
004113F3  sub         esp,144h
004113F9  push        ebx 
004113FA  push        esi 
004113FB  push        edi 
004113FC  lea         edi,[ebp-144h]
00411402  mov         ecx,51h
00411407  mov         eax,0CCCCCCCCh
0041140C  rep stos    dword ptr es:[edi]

    int xx=sum(3,4);
0041140E  push        4                   //push数据4
00411410  push        3                   //push数据3
00411412  call        sum (41105Fh) //调用子程序计算
00411417  add         esp,8             //维护堆栈平衡,因为之前push了2个int值,占8字节,这里esp+8就是将通知栈指针回收栈空间8字节的意思
0041141A  mov         dword ptr [xx],eax   //赋值计算结果给ptr[xx],注意,这里说明了函数返回值是保存在eax寄存器中的,毕竟返回值(不管是指针还是数值)的只有一个。
    char *str = "sdfsdf";

 

 

肚子饿了,先到这里,里面很多不知道什么意思,等回去求教高人去,回来再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值