1 #include "stdafx.h" 2 3 4 5 int fun(int a,int b) 6 { 7 int c=a+b; 8 int i; 9 for(i=0;i<50;i++)10 {11 c=c+i;12 }13 return c;14 }15 16 17 int _tmain(int argc, _TCHAR* argv[])18 {19 20 int m=fun(11,22);21 return 0;22 }
下面是汇编代码:
1 int fun(int a,int b) 2 { 3 00412CE0 push ebp ;ebp入栈 4 00412CE1 mov ebp,esp ;用ebp保存esp的值 5 00412CE3 sub esp,0D8h ;为局部变量申请空间 6 00412CE9 push ebx ; 7 00412CEA push esi ; 8 00412CEB push edi ;寄存器入栈,保存它们的值 9 00412CEC lea edi,[ebp-0D8h] ;获得局部变量空间的首地址10 00412CF2 mov ecx,36h ;确定stos的终止条件11 00412CF7 mov eax,0CCCCCCCCh ;将eax的值初始化为CCCCCCCC,也就是int3断点的机器码12 00412CFC rep stos dword ptr es:[edi] ;讲CC放入申请的局部变量空间13 int c=a+b;14 00412CFE mov eax,dword ptr [a] ;eax=a15 00412D01 add eax,dword ptr [b] ;eax=a+b16 00412D04 mov dword ptr [c],eax ;c=eax17 int i;18 for(i=0;i<50;i++)19 00412D07 mov dword ptr [i],0 ;int i=020 00412D0E jmp fun+39h (412D19h) ;跳转到B21 00412D10 mov eax,dword ptr [i] ;这里是A的开始22 00412D13 add eax,1 ;23 00412D16 mov dword ptr [i],eax ;i++24 00412D19 cmp dword ptr [i],32h ;这里是B的开始 i<50?25 00412D1D jge fun+4Ah (412D2Ah) ;如果i大于或等于50,则此条语句实现,跳出循环26 {27 c=c+i;28 00412D1F mov eax,dword ptr [c] ;eax=c29 00412D22 add eax,dword ptr [i] ;eax++ 30 00412D25 mov dword ptr [c],eax ;c=eax31 }32 00412D28 jmp fun+30h (412D10h) ;跳转到A33 return c;34 00412D2A mov eax,dword ptr [c] ;将结果保存到eax中,作为返回的结果35 }36 00412D2D pop edi ;弹出保存的寄存器值,实现堆栈的平衡37 00412D2E pop esi ;38 00412D2F pop ebx ;39 00412D30 mov esp,ebp ;40 00412D32 pop ebp ;41 00412D33 ret
我们主要看循环部分的代码。
循环主要用这么几条指令来实现:
mov 进行初始化
jmp跳过修改循环变量的代码
cmp实现条件判断
jge根据条件跳转
1 mov <循环变量> , <初始值> ;给循环变量赋初值 2 jmp B ;跳到第一次循环处 3 A : (改动循环变量) ;修改循环变量 4 ... 5 6 B : cmp <循环变量> , <限制变量> ;检查循环条件 7 jge 跳出循环 8 (循环体) 9 ...10 jmp A ;跳回去修改循环变量 限制变量> 循环变量> 初始值> 循环变量>
。。。。。。。。。。。。。。。。