目录
一.for循环
<1>.格式:
<2>.for循环只有中间的条件表达式时反汇编跟while是一模一样的
<3>.for循环反汇编中间插了个jmp 一眼就可看出是for循环
二.for循环九九乘法表
三.for循环九九乘法表裸汇编
一.for循环
<1>.格式:
for( ; ;)
{
}
for( ; ;)
{
}
括号里的表达式
第1个.赋初值
第2个.判断条件
第3个.跳出循环的条件(一般自增自减)
for循环可以是1个表达式 可以是2个表达式 可以是3个表达式.
<2>.for循环只有中间的条件表达式时反汇编跟while是一模一样的
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循环不能说毫无关系,只能说一模一样
<3>.for循环反汇编中间插了个jmp 一眼就可看出是for循环
二.for循环九九乘法表
int fun()
{
int a;
int b;
for(a=1;a<=9;a++)
{
for (b=1;b<=a;b++)
{
printf("%d*%d=%dt",b,a,b*a);
}
printf("n");
}
return 0;
}
代码如上所示,打印出来如下图所示
三.for循环九九乘法表裸汇编
char*p="%d*%d=%dt";
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循环九九乘法表裸汇编如上,打印出来如下图片所示
今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!


![[逆向|C语言]C语言for循环九九乘法表以及裸汇编 [逆向|C语言]C语言for循环九九乘法表以及裸汇编](http://www.mshxw.com/aiimages/31/990737.png)
