for( ; ;)
{}
括号里的表达式
第1个.赋初值
第2个.判断条件
第3个.跳出循环的条件(一般自增自减)
for循环可以是1个表达式 可以是2个表达式 可以是3个表达式.
int fun1() { int a; int b; a=1; b=0; for(;a<=100;) { b=b+a; a++; } printf("%d",b); return 0; }
上面for循环代码的反汇编如下图所示
int fun2() { int a; int b; a=1; b=0; while(a<=100) { b=b+a; a++; } printf("%d",b); return 0; }
这是while循环代码
这是while循环反汇编,对比两个循环的反汇编,注意观察 ,for循环只有中间的条件表达式时反汇编跟while循环不能说毫无关系,只能说一模一样
int fun() { int a; int b; for(a=1;a<=9;a++) { for (b=1;b<=a;b++) { printf("%d*%d=%d\t",b,a,b*a); } printf("\n"); } return 0; }
代码如上所示,打印出来如下图所示
char*p="%d*%d=%d\t"; char*p1="\n"; char*p2="这是for循环裸汇编运行出来的\n"; _declspec(naked) int fund() { _asm { push ebp mov ebp,esp sub esp,0x48 push ebx push esi push edi lea edi,dword ptr ds:[ebp-0x48] mov ecx,0x12 mov eax,0xcccccccc stosd //a=1 mov dword ptr ds:[ebp-0x4],0x1 jmp lab1 lab4: //a++ mov eax,dword ptr ds:[ebp-0x4] add eax,0x1 mov dword ptr ds:[ebp-0x4],eax lab1: //a<=9 cmp dword ptr ds:[ebp-0x4],0x9 jg lab7 //b=1 mov dword ptr ds:[ebp-0x8],0x1 jmp lab2 lab6: //b++ mov ecx,dword ptr ds:[ebp-0x8] add ecx,0x1 mov dword ptr ds:[ebp-0x8],ecx lab2: //b<=a mov edx,dword ptr ds:[ebp-0x4] cmp DWORD ptr ds:[ebp-0x8],edx jg lab3 mov eax,dword ptr ds:[ebp-0x8] imul eax,dword ptr ds:[ebp-0x4] push eax push DWORD ptr ds:[ebp-0x4] push DWORD ptr ds:[ebp-0x8] mov ecx,p push ecx call printf add esp,0x10 jmp lab6 lab3: mov edx,p1 push edx call printf add esp,0x4 jmp lab4 lab7: mov edx,p2 push edx call printf add esp,0x4 xor eax,eax pop edi pop esi pop ebx mov esp,ebp pop ebp ret } }
for循环九九乘法表裸汇编如上,打印出来如下图片所示
今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!
搜索
复制