首页
社区
课程
招聘
[旧帖] [原创]一个c程序的始末(带嵌套) 0.00雪花
发表于: 2015-5-6 21:40 1343

[旧帖] [原创]一个c程序的始末(带嵌套) 0.00雪花

2015-5-6 21:40
1343
int CumulativeHundred1(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j);                
int CumulativeHundred7(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)               
{                
        int sum;        
        int stub;        
        stub = (a>=90) ? 0:CumulativeHundred1 (a+20,b+20, c+20,d+20, e+20, f+20, g+20,h+20,i+20,j+20);        
        sum = stub +g+h+i+j + ((a<<1)+10+(b<<1)+10+(c<<1) +10+(d<<1) +10        
                +(e<<1) +10+(f<<1)+10+g+10+h+10+i+10+j+10);
        return sum;        
}                
int CumulativeHundred6(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j)                
{                
        int sum;       
        int stub;        
        stub = (a>=90) ? 0:CumulativeHundred7(a+20,b+20, c+20,d+20, e+20,f+20, g+20,h+20,i+20,j+20);        
        sum = stub +f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+ (d<<1)        
                +10 +(e<<1)+10+f+10+g+10+h+10+i+10+j+10);
        return sum;        
}                
int CumulativeHundred5(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)                
{                
        int sum;        
        int stub;        
        stub = (a>=90) ? 0:CumulativeHundred6(a+20,b+20, c+20, d+20, e+20, f+20, g+20,h+20,i+20,j+20);        
        sum = stub +e+f+g+h+i+j + ((a<<1)+10+(b<<1) +10+(c<<1)+ 10+(d<<1)        
                +10 +e+10+f+10+g+10+h+10+i+10+j+10);
        return sum;        
}                
int CumulativeHundred4(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)                
{                
        int sum;        
        int stub;        
        stub = (a>=90) ? 0:CumulativeHundred5(a+20,b+20,c+20, d+20,e+20, f+20, g+20,h+20,i+20,j+20);        
        sum = stub +d+e+f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+d+        
                10+ e+ 10+f+10+g+10+h+10+i+10+j+10);
        return sum;        
}                
int CumulativeHundred3(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)                
{                
        int sum;        
        int stub;        
        stub = (a>=90) ? 0: CumulativeHundred4 (a+20,b+20, c+20,d+20, e+20, f+20, g+20,h+20,i+20,j+20);        
        sum = stub +c+d+e+f+g+h+i+j + ((a<<1) +10+ (b<<1) +10+c +10+d +10+e + 10 +f +10+g+10+h+10+i+10+j+10);        
        return sum;        
}                
int CumulativeHundred2(int a,int b,int c,int d,int e, int f, int g,int h,int i,int j)                
{                
        int sum;        
        int stub;        
        stub = (a>=90) ? 0: CumulativeHundred3 (a+20, b+20, c+20, d+20,e+20, f+20,g+20,h+20,i+20,j+20);        
        sum = stub+b+c+d+e+f+g+h+i+j + ((a<<1) +10 +b +10 +c +10 +d +10 +e +10+f+10+g+10+h+10+i+10+j+10);        
        return sum;        
}                
int CumulativeHundred1(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)                
{                
        int sum;        
        int stub;        
        stub = (a>=90) ? 0:CumulativeHundred2(a+20,b+20, c+20, d+20, e+20, f+20, g+20,h+20,i+20,j+20);        
        sum = stub +a+b+c+d+e+f+g+h+i+j + (a+10+b+10 +c+10+d +10+e+10 +f+10 +g+10+h+10+i+10+j+10);        
        return sum;        
}                
               
void main()               
{               
   CumulativeHundred1(1,2,3,5,6,7,8,9,10,11);               
}               
这个是练习移位运算,熟悉C语言的反汇编的

这是我画的内存单元图
0012FC04        0012FC10edi               
0012FC08        0esi               
0012FC0C        7FFD8000ebx               
0012FC10  CC CC CC CC  烫烫                       
0012FC14  CC CC CC CC  烫烫                       
0012FC18  CC CC CC CC  烫烫                       
0012FC1C  CC CC CC CC  烫烫                       
0012FC20  CC CC CC CC  烫烫                       
0012FC24  CC CC CC CC  烫烫                       
0012FC28  CC CC CC CC  烫烫                       
0012FC2C  CC CC CC CC  烫烫                       
0012FC30  CC CC CC CC  烫烫                       
0012FC34  CC CC CC CC  烫烫                       
0012FC38  CC CC CC CC  烫烫                       
0012FC3C  CC CC CC CC  烫烫                       
0012FC40  CC CC CC CC  烫烫                       
0012FC44  CC CC CC CC  烫烫                       
0012FC48  CC CC CC CC  烫烫                       
0012FC4C  CC CC CC CC  烫烫                       
0012FC50  CC CC CC CC  烫烫        00 00 00 00        mov dword ptr [ebp-0Ch],0       
0012FC54  CC CC CC CC  烫烫        00 00 00 00         ecx,dword ptr [ebp-0Ch]         dword ptr [ebp-8],ecx
0012FC58  CC CC CC CC  烫烫                       
0012FC5C        ebp               
0012FC60        eflage               
0012FC64        65               
0012FC68        66               
0012FC6C        67               
0012FC70        69               
0012FC74        0000006A               
0012FC78        0000006B               
0012FC7C        0000006C               
0012FC80        0000006D               
0012FC84        0000006E               
0012FC88        0000006F        函数6       
0012FC8C        0012FD6Cedi               
0012FC90        esi0               
0012FC94        7FFD8000ebx               
0012FC98  CC CC CC CC  烫烫                       
0012FC9C  CC CC CC CC  烫烫                       
0012FCA0  CC CC CC CC  烫烫                       
0012FCA4  CC CC CC CC  烫烫                       
0012FCA8  CC CC CC CC  烫烫                       
0012FCAC  CC CC CC CC  烫烫                       
0012FCB0  CC CC CC CC  烫烫                       
0012FCB4  CC CC CC CC  烫烫                       
0012FCB8  CC CC CC CC  烫烫                       
0012FCBC  CC CC CC CC  烫烫                       
0012FCC0  CC CC CC CC  烫烫                       
0012FCC4  CC CC CC CC  烫烫                       
0012FCC8  CC CC CC CC  烫烫                       
0012FCCC  CC CC CC CC  烫烫                       
0012FCD0  CC CC CC CC  烫烫                       
0012FCD4  CC CC CC CC  烫烫                       
0012FCD8  CC CC CC CC  烫烫                       
0012FCDC  CC CC CC CC  烫烫                       
0012FCE0  CC CC CC CC  烫烫                       
0012FCE4        0012FD6C               
0012FCE8        eflage               
0012FCEC        51               
0012FCF0        52               
0012FCF4        53               
0012FCF8        55               
0012FCFC        56               
0012FD00        57               
0012FD04        58               
0012FD08        59               
0012FD0C        0000005A               
0012FD10        0000005B        函数5       
0012FD14        0012FD14edi               
0012FD18        esi0               
0012FD1C        7FFD8000ebx               
0012FD20  CC CC CC CC  烫烫                       
0012FD24  CC CC CC CC  烫烫                       
0012FD28  CC CC CC CC  烫烫                       
0012FD2C  CC CC CC CC  烫烫                       
0012FD30  CC CC CC CC  烫烫                       
0012FD34  CC CC CC CC  烫烫                       
0012FD38  CC CC CC CC  烫烫                       
0012FD3C  CC CC CC CC  烫烫                       
0012FD40  CC CC CC CC  烫烫                       
0012FD44  CC CC CC CC  烫烫                       
0012FD48  CC CC CC CC  烫烫                       
0012FD4C  CC CC CC CC  烫烫                       
0012FD50  CC CC CC CC  烫烫                       
0012FD54  CC CC CC CC  烫烫                       
0012FD58  CC CC CC CC  烫烫                       
0012FD5C  CC CC CC CC  烫烫                       
0012FD60  CC CC CC CC  烫烫                       
0012FD64  CC CC CC CC  烫烫                       
0012FD68  CC CC CC CC  烫烫                       
0012FD6C        0012fd04ebp               
0012FD70         elage               
0012FD74        0000003D               
0012FD78        0000003E               
0012FD7C        0000003F               
0012FD80        41               
0012FD84        42               
0012FD88        43               
0012FD8C        44               
0012FD90        45               
0012FD94        46               
0012FD98        47        函数4       
0012FD9C        0012FE7C               
0012FDA0        0               
0012FDA4        7FFD8000               
0012FDA8  CC CC CC CC  烫烫                       
0012FDAC  CC CC CC CC  烫烫                       
0012FDB0  CC CC CC CC  烫烫                       
0012FDB4  CC CC CC CC  烫烫                       
0012FDB8  CC CC CC CC  烫烫                       
0012FDBC  CC CC CC CC  烫烫                       
0012FDC0  CC CC CC CC  烫烫                       
0012FDC4  CC CC CC CC  烫烫                       
0012FDC8  CC CC CC CC  烫烫                       
0012FDCC  CC CC CC CC  烫烫                       
0012FDD0  CC CC CC CC  烫烫                       
0012FDD4  CC CC CC CC  烫烫                       
0012FDD8  CC CC CC CC  烫烫                       
0012FDDC  CC CC CC CC  烫烫                       
0012FDE0  CC CC CC CC  烫烫                       
0012FDE4  CC CC CC CC  烫烫                       
0012FDE8  CC CC CC CC  烫烫                       
0012FDEC  CC CC CC CC  烫烫                       
0012FDF0  CC CC CC CC  烫烫                       
0012FDF4        0012FE7C               
0012FDF8        eflage               
0012FDFC        29               
0012FE00        0000002A               
0012FE04        0000002B               
0012FE08        0000002D               
0012FE0C        0000002E               
0012FE10        0000002F               
0012FE14        30               
0012FE18        31               
0012FE1C        32               
0012FE20        33        函数3       
0012FE24        0012FF04               
0012FE28        0               
0012FE2C        7FFD8000               
0012FE30  CC CC CC CC  烫烫                       
0012FE34  CC CC CC CC  烫烫                       
0012FE38  CC CC CC CC  烫烫                       
0012FE3C  CC CC CC CC  烫烫                       
0012FE40  CC CC CC CC  烫烫                       
0012FE44  CC CC CC CC  烫烫                       
0012FE48  CC CC CC CC  烫烫                       
0012FE4C  CC CC CC CC  烫烫                       
0012FE50  CC CC CC CC  烫烫                       
0012FE54  CC CC CC CC  烫烫                       
0012FE58  CC CC CC CC  烫烫                       
0012FE5C  CC CC CC CC  烫烫                       
0012FE60  CC CC CC CC  烫烫                       
0012FE64  CC CC CC CC  烫烫                       
0012FE68  CC CC CC CC  烫烫                       
0012FE6C  CC CC CC CC  烫烫                       
0012FE70  CC CC CC CC  烫烫                       
0012FE74  CC CC CC CC  烫烫                       
0012FE78  CC CC CC CC  烫烫                       
0012FE7C        0012FF04               
0012FE80        eflage               
0012FE84        15               
0012FE88        16               
0012FE8C        17               
0012FE90        19               
0012FE94        0000001A               
0012FE98        0000001B               
0012FE9C        0000001C               
0012FEA0        0000001D               
0012FEA4        0000001E               
0012FEA8        0000001F        函数2       
0012FEAC        0012FF80edi               
0012FEB0        esi0               
0012FEB4        7FFD8000ebx               
0012FEB8  CC CC CC CC  烫烫                       
0012FEBC  CC CC CC CC  烫烫                       
0012FEC0  CC CC CC CC  烫烫                       
0012FEC4  CC CC CC CC  烫烫                       
0012FEC8  CC CC CC CC  烫烫                       
0012FECC  CC CC CC CC  烫烫                       
0012FED0  CC CC CC CC  烫烫                       
0012FED4  CC CC CC CC  烫烫                       
0012FED8  CC CC CC CC  烫烫                       
0012FEDC  CC CC CC CC  烫烫                       
0012FEE0  CC CC CC CC  烫烫                       
0012FEE4  CC CC CC CC  烫烫                       
0012FEE8  CC CC CC CC  烫烫                       
0012FEEC  CC CC CC CC  烫烫                       
0012FEF0  CC CC CC CC  烫烫                       
0012FEF4  CC CC CC CC  烫烫                       
0012FEF8  CC CC CC CC  烫烫                       
0012FEFC  CC CC CC CC  烫烫                       
0012FF00  CC CC CC CC  烫烫                       
0012FF04        0012FF04ebp               
0012FF08        eflage               
0012FF0C  01 00 00 00  ....                       
0012FF10  02 00 00 00  ....                       
0012FF14  03 00 00 00  ....                       
0012FF18  05 00 00 00  ....                       
0012FF1C  06 00 00 00  ....                       
0012FF20  07 00 00 00  ....                       
0012FF24  08 00 00 00  ....                       
0012FF28  09 00 00 00          9               
0012FF2C  0A 00 00 00  ....                       
0012FF30  0B 00 00 00  ....                函数1       
0012FF34        0               
0012FF38        0               
0012FF3C        7FFDD000               
0012FF40  CC CC CC CC  烫烫                       
0012FF44  CC CC CC CC  烫烫                       
0012FF48  CC CC CC CC  烫烫                       
0012FF4C  CC CC CC CC  烫烫                       
0012FF50  CC CC CC CC  烫烫                       
0012FF54  CC CC CC CC  烫烫                       
0012FF58  CC CC CC CC  烫烫                       
0012FF5C  CC CC CC CC  烫烫                       
0012FF60  CC CC CC CC  烫烫                       
0012FF64  CC CC CC CC  烫烫                       
0012FF68  CC CC CC CC  烫烫                       
0012FF6C  CC CC CC CC  烫烫                       
0012FF70  CC CC CC CC  烫烫                       
0012FF74  CC CC CC CC  烫烫                       
0012FF78  CC CC CC CC  烫烫                       
0012FF7C  CC CC CC CC  烫烫                       
0012FF80        0012FFC0        void main       
0012FF84                       

过程:
1,将函数的输入值存入内存空间
2.push ebp(保存ebp的原值)
3.esp减去一个数,处于上端,如果设这个值为x
4,push ebx,esi,edi(保存它们的原值)
5, 将edi置为步骤3中的x
6.使用rep stos将其间的全部置为cccccccc
7.如果本函数内有计算出的值存入之前置为cccccccc的内存空间
8.结束的时候,pop edi(还原edi)
pop esi(还原esi)
pop ebx(还原ebx)
将ebp中的值赋给esp,之前存储了esp的值,为下面还原ebp做准备
pop ebp(还原ebp)

顺着内存单元的时候,很简单画内存单元图就可以理解了
逆着的时候(在最后一个引用函数结束之后的汇编)
要结合程序的流程理解
每次先讲上一个结果(eax)存入之前说的cccccccc中
再将其存入这个内存单元下面的内存单元(疑问“不过我还是不明白为什么要保存两份之前的值”疑问)和ecx中,
之后就是计算(略)
18:       sum = stub +f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+ (d<<1)+10 +(e<<1)+10+f+10+g+10+h+10+i+10+j+10)       
004011FE   mov         edx,dword ptr [ebp-8]              stub
00401201   add         edx,dword ptr [ebp+1Ch]        f
00401204   add         edx,dword ptr [ebp+20h]        g
00401207   add         edx,dword ptr [ebp+24h]        h
0040120A   add         edx,dword ptr [ebp+28h]        i
0040120D   add         edx,dword ptr [ebp+2Ch]        j
00401210   mov         eax,dword ptr [ebp+8]        a
00401213   mov         ecx,dword ptr [ebp+1Ch]        f
00401216   lea         eax,[ecx+eax*2+0Ah]              f+(a<<1)+10
0040121A   mov         ecx,dword ptr [ebp+0Ch]        b
0040121D   lea         eax,[eax+ecx*2]                      f+(a<<1)+10+(b<<1)
00401220   mov         ecx,dword ptr [ebp+10h]        c
00401223   lea         eax,[eax+ecx*2+14h]              f+(a<<1)+10+(b<<1)+(c<<1)+10+10
00401227   mov         ecx,dword ptr [ebp+14h]        d
0040122A   lea         eax,[eax+ecx*2]                      f+(a<<1)+10+(b<<1)+(c<<1)+10+10+(d<<1)
0040122D   mov         ecx,dword ptr [ebp+18h]        e
00401230   lea         eax,[eax+ecx*2+14h]              f+(a<<1)+10+(b<<1)+(c<<1)+10+10+(d<<1)+(e<<1)+10+10
00401234   mov         ecx,dword ptr [ebp+20h]       
00401237   lea         eax,[eax+ecx+0Ah]                  eax = eax+10+f
0040123B   mov         ecx,dword ptr [ebp+24h]       
0040123E   lea         eax,[eax+ecx+0Ah]                        eax = eax+10+g
00401242   mov         ecx,dword ptr [ebp+28h]       
00401245   lea         eax,[eax+ecx+0Ah]                        eax = eax+10+h
00401249   add         edx,dword ptr [ebp+2Ch]        i
0040124C   lea         ecx,[eax+edx+14h]                        eax = eax+i+j+20
这里就是发现C语言移位<<1翻译为汇编时是*2,不是shl,sal。

最后都结束时

我是新手,以上可能有很多不足之处,希望大家能指出,另外帖子中有我的一个疑问希望大家能告诉我是怎么一回事(疑问“不过我还是不明白为什么要保存两份之前的值”疑问,提前说声谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
比较详细,呵呵!
2015-5-7 08:19
0
游客
登录 | 注册 方可回帖
返回
//