C++黑客编程第五章C语言逆向基础笔记(四)——循环结构

循环结构分析

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循环效率又高效一些。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值