0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言的3种循环结构分析

Q4MP_gh_c472c21 来源:计算机与网络安全 作者:计算机与网络安全 2021-05-20 13:43 次阅读

C语言的循环结构有for循环、while循环、do循环和goto循环。本文介绍前3种循环方式。

1. for循环结构

for循环也可以称为步进循环,它的特点是常用于已经明确了循环的范围。看一个简单的C语言代码,具体如下:

#include 《stdio.h》int main(){ int nNum = 0, nSum = 0; for ( nNum = 1; nNum 《= 100; nNum ++ ) { nSum += nNum; } printf(“nSum = %d

”, nSum); return 0;}

这是很典型的求1~100的累加和的程序。通过这个程序来认识关于for循环结构的反汇编代码。

.text:00401028 mov [ebp+nNum], 0.text:0040102F mov [ebp+nSum], 0.text:00401036 mov [ebp+nNum], 1.text:0040103D jmp short LOC_CMP.text:0040103F ; ---------------------------------------------------------.text:0040103F.text:0040103F LOC_STEP: ; CODE XREF: _main+47j.text:0040103F mov eax, [ebp+nNum].text:00401042 add eax, 1.text:00401045 mov [ebp+nNum], eax.text:00401048.text:00401048 LOC_CMP: ; CODE XREF: _main+2Dj.text:00401048 cmp [ebp+nNum], 64h.text:0040104C jg short LOC_ENDFOR.text:0040104E mov ecx, [ebp+nSum].text:00401051 add ecx, [ebp+nNum].text:00401054 mov [ebp+nSum], ecx.text:00401057 jmp short LOC_STEP.text:00401059 ; ---------------------------------------------------------.text:00401059.text:00401059 LOC_ENDFOR: ; CODE XREF: _main+3Cj.text:00401059 mov edx, [ebp+nSum].text:0040105C push edx.text:0040105D push offset Format ; “nSum = %d

”.text:00401062 call _printf.text:00401067 add esp, 8.text:0040106A xor eax, eax

这次的反汇编代码,修改了其中的变量、标号,看起来更加直观。从修改的标号来看,for结构可以分为3部分,在LOC_STEP上面的部分是初始化部分,在LOC_STEP下面的部分是修改循环变量的部分,在LOC_CMP下面和LOC_ENDFOR上面部分是比较循环条件和循环体的部分。

for循环的反汇编结构如下:

; 初始化循环变量 jmp LOC_CMPLOC_STEP: ; 修改循环变量LOC_CMP: ; 循环变量的判断 jxx LOC_ENDFOR ; 循环体 jmp LOC_STEPLOC_ENDOF:

再用IDA来看一下生成的流程结构图,如图1所示。

c69876aa-b3ed-11eb-bf61-12bb97331649.jpg

图1 for结构的流程图

2. do…while循环结构

do循环的循环体总是会被执行一次,这是do循环与while循环的区别。这里还是1~100的累加和代码,来看一下它的反汇编结构。先看C语言代码,具体如下:

#include 《stdio.h》int main(){ int nNum = 1, nSum = 0; do { nSum += nNum; nNum ++; } while ( nNum 《= 100 ); printf(“nSum = %d

”, nSum); return 0;}

do循环的结构要比for循环的结构简单很多,反汇编代码也少很多。先来看一下IDA生成的流程图,如图2所示。

c6a590e2-b3ed-11eb-bf61-12bb97331649.jpg

图2 do循环流程图

反汇编代码如下:

.text:00401028 mov [ebp+nNum], 1.text:0040102F mov [ebp+nSum], 0.text:00401036.text:00401036 LOC_DO: ; CODE XREF: _main+3Cj.text:00401036 mov eax, [ebp+nSum].text:00401039 add eax, [ebp+nNum].text:0040103C mov [ebp+nSum], eax.text:0040103F mov ecx, [ebp+nNum].text:00401042 add ecx, 1.text:00401045 mov [ebp+nNum], ecx.text:00401048 cmp [ebp+nNum], 64h.text:0040104C jle short LOC_DO.text:0040104E mov edx, [ebp+nSum].text:00401051 push edx.text:00401052 push offset Format ; “nSum = %d

”.text:00401057 call _printf.text:0040105C add esp, 8.text:0040105F xor eax, eax

do循环的主体就在LOC_DO和0040104C的jle之间。其结构整理如下:

; 初始化循环变量LOC_DO: ; 执行循环体 ; 修改循环变量 ; 循环变量的比较 Jxx LOC_DO

3. while循环结构

while循环与do循环的区别在于,在进入循环体之前需要先进行一次条件判断,循环体有可能因为循环条件的不成立而一次也不执行。看1~100累加和的while循环代码:

#include 《stdio.h》int main(){ int nNum = 1, nSum = 0; while ( nNum 《= 100 ) { nSum += nNum; nNum ++; } printf(“nSum = %d

”, nSum); return 0;}

再来看一下它的反汇编代码,while循环比do循环多了一个条件的判断,因此会多一条分支。反汇编代码如下:

.text:00401028 mov [ebp+nNum], 1.text:0040102F mov [ebp+nSum], 0.text:00401036.text:00401036 LOC_WHILE: ; CODE XREF: _main+3Ej.text:00401036 cmp [ebp+nNum], 64h.text:0040103A jg short LOC_WHILEEND.text:0040103C mov eax, [ebp+nSum].text:0040103F add eax, [ebp+nNum].text:00401042 mov [ebp+nSum], eax.text:00401045 mov ecx, [ebp+nNum].text:00401048 add ecx, 1.text:0040104B mov [ebp+nNum], ecx.text:0040104E jmp short LOC_WHILE.text:00401050 ; -----------------------------------------------------------.text:00401050.text:00401050 LOC_WHILEEND: ; CODE XREF: _main+2Aj.text:00401050 mov edx, [ebp+nSum].text:00401053 push edx.text:00401054 push offset Format ; “nSum = %d

”.text:00401059 call _printf.text:0040105E add esp, 8.text:00401061 xor eax, eax

while循环的主要部分全部在LOC_WHILE和LOC_WHILEEND之间。在LOC_WHILE下面的两句是cmp和jxx指令,在LOC_WHILEEND上面是jmp指令。这两部分是固定的格式,其结构整理如下:

; 初始化循环变量等LOC_WHILE: cmp xxx, xxx jxx LOC_WHILEEND ; 循环体 jmp LOC_WHILELOC_WHILEEND:

再来看一下IDA生成的流程图,如图3所示。

c6c288f0-b3ed-11eb-bf61-12bb97331649.jpg

图3 while循环流程图

对于for循环、do循环和while循环这3种循环而言,do循环的效率显然高些,而while循环相对来说比for循环效率又高些。

参考文献:C++ 黑客编程揭秘与防范(第3版)

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136692
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    81004

原文标题:C语言逆向之循环结构分析

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深入理解C语言循环语句的应用与优化技巧

    能让你的代码更加简洁明了,还能显著提升程序执行效率。本文将详细介绍C语言中的三常见循环结构——while
    的头像 发表于 12-07 01:11 106次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>循环</b>语句的应用与优化技巧

    C语言指针学习笔记

    本文从底层内存分析,彻底让读者明白C语言指针的本质。
    的头像 发表于 11-05 17:40 229次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>指针学习笔记

    C语言C++中结构体的区别

    同样是结构体,看看在C语言C++中有什么区别?
    的头像 发表于 10-30 15:11 199次阅读

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器码,这些机器码与原始的 C 语言代码在
    的头像 发表于 09-02 10:37 2130次阅读

    技术干货驿站 ▏深入理解C语言:掌握程序结构知识

    在计算机编程的世界中,C语言被广泛认可为一门强大而高效的编程语言,其简洁的语法和直接的指令使得它成为了许多程序员的首选。了解C语言的程序
    的头像 发表于 07-27 08:45 1347次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:掌握程序<b class='flag-5'>结构</b>知识

    嵌入式中C语言结构体基本实现

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构C语言编程中允许您存储不同数据类型的数据。
    的头像 发表于 05-11 08:49 1012次阅读
    嵌入式中<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>结构</b>体基本实现

    C语言结构体史上最详细的讲解【软件干货】

    struct结构体数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如 char int float long double string(c99) 等等数据类型,他们可以表示
    的头像 发表于 03-28 17:52 745次阅读

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 494次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>结构</b>体的基础实现与应用

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级
    的头像 发表于 02-28 14:25 617次阅读

    plc编程语言c语言的联系 c语言和PLC有什么区别

    语言,主要用于开发各种应用程序。尽管PLC编程语言C语言有一些相似之处,但它们之间也存在一些明显的区别。 首先,PLC编程语言
    的头像 发表于 02-05 14:21 4090次阅读

    c语言,c++,java,python区别

    C语言C++、Java和Python是四常见的编程语言,各有优点和特点。 C
    的头像 发表于 02-05 14:11 2361次阅读

    vb语言c++语言的区别

    VB语言C++语言是两不同的编程语言,虽然它们都属于高级编程语言,但在设计和用途上有很多区别
    的头像 发表于 02-01 10:20 2257次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C
    的头像 发表于 01-12 16:03 5630次阅读

    嵌入式C语言大神的进阶思路

    熟悉一或几种CPU架构,掌握几种架构的汇编语言,学会使用反汇编去分析C语言底层运行过程
    的头像 发表于 01-02 09:58 623次阅读

    C语言数据结构之跳表详解

    大家好,今天分享一篇C语言数据结构相关的文章--跳表。
    的头像 发表于 12-29 09:32 824次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>数据<b class='flag-5'>结构</b>之跳表详解