循环结构分析
for循环
C语言代码:
#include <stdio.h>
int main()
{
int nNum = 0, nSum = 0;
for (nNum = 1;nNum <=100; nNum++)
{
nSum += nNum;
}
printf("nSum = %d \r\n", nSum);
return 0;
}
导入IDA中查看:
for循环的反汇编结构如下:
; 初始化循环变量
jmp LOC_CMP
LOC_STEP:
; 修改循环变量
LOC_CMP:
; 循环变量的判断
jxx LOC_ENDFOR
; 循环体
jmp LOC_STEP
LOC_ENDOF:
流程结构图
do...while循环结构
C语言代码:
#include <stdio.h>
int main()
{
int nNum = 1, nSum = 0;
do
{
nSum += nNum;
nNum ++;
}while (nNum <= 100);
printf("nSum = %d \r\n", nSum);
return 0;
}
do循环流程图
反汇编代码:
do循环的主体就在LOC_DO和0040104C的jle之间,结构如下
; 初始化循环变量
LOC_DO:
; 执行循环体
; 修改循环变量
; 循环变量的比较
Jxx LOC_DO
while循环结构
while循环和do循环的区别在于,在进入循环体之前需要先进行一次条件判断,循环体有可能因为循环条件的不成立而一次也不执行
如下为一到一百累加的while循环代码:
#include <stdio.h>
int main()
{
int nNum = 1, nSum = 0;
while (nNum <= 100)
{
nSum += nNum;
nNum ++;
}
printf("nSum = %d \r\n",nSum);
return 0;
}
导入IDA中知:
此时的while循环比do循环多了一个条件判断,因此会多一条分支
结构整理如下
; 初始化循环变量等
LOC_WHILE:
cmp xxx, xxx
jxx LOC_WHILEEND
; 循环体
jmp LOC_WHILE
LOC_WHILEEND:
结合IDA的流程图
总结:
对于for循环、do循环和while循环这三种循环而言,do循环的效率显然更高,而while循环相对来说比for循环效率又高效一些。