Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言循环的实现

C语言循环的实现

作者头像
Masimaro
发布于 2018-08-31 08:01:57
发布于 2018-08-31 08:01:57
2.6K00
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
C语言中采用3中语法来实现循环,它们分别是whilefordo while,本文将分别说明这三种循环的实现,并对它们的运行效率进行比较。

do while

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
首先来看do while的实现:下面是简单的代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int nCount = 0;
int nMax = 10;
do 
{
    nCount++;
} while (nCount < nMax);
return 0;   

下面对应的是它的汇编代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
9:        int nCount = 0;
00401268   mov         dword ptr [ebp-4],0
10:       int nMax = 10;
0040126F   mov         dword ptr [ebp-8],0Ah
11:       do
12:       {
13:           nCount++;
00401276   mov         eax,dword ptr [ebp-4]
00401279   add         eax,1
0040127C   mov         dword ptr [ebp-4],eax
14:       } while (nCount < nMax);
0040127F   mov         ecx,dword ptr [ebp-4];exc = nCount
00401282   cmp         ecx,dword ptr [ebp-8];比较nCount 和 nMax的值
00401285   jl          main+26h (00401276);跳转到循环体中
15:       return 0;
00401287   xor         eax,eax

在汇编代码中首先执行了一次循环体中的操作,然后判断,当条件满足时会跳转回循环体,然后再次执行,当条件不满足时会接着执行后面的语句。 这个过程可以用goto来模拟:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int nCount = 0;
    int nMax = 10;
__WHILE:
    nCount++;
    if(nCount < nMax)
        goto __WHILE;

while循环

不同于do while的先执行再比较,while采取的是先比较再循环的方式,下面是一个while的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int nCount = 0;
    int nMax = 10;
    while (nCount < nMax)
    {
        nCount++;
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
00401268   mov         dword ptr [ebp-4],0
10:       int nMax = 10;
0040126F   mov         dword ptr [ebp-8],0Ah
11:       while (nCount < nMax)
00401276   mov         eax,dword ptr [ebp-4]
00401279   cmp         eax,dword ptr [ebp-8]
0040127C   jge         main+39h (00401289)
12:       {
13:           nCount++;
0040127E   mov         ecx,dword ptr [ebp-4]
00401281   add         ecx,1
00401284   mov         dword ptr [ebp-4],ecx
14:       }
00401287   jmp         main+26h (00401276)
15:       return 0;
00401289   xor         eax,eax

从汇编代码上可以看出,执行while循环时会有两次跳转,当条件不满足时会执行一次跳转,跳转到循环体外,而条件满足,执行完一次循环后,会再次跳转到循环体中,再次进行比较。相比于do while来说,while执行了两次跳转,效率相对较低。

for 循环

for循环是首先进行初始化操作然后进行比较,条件满足时执行循环,再将循环变量递增,最后再次比较,执行循环或者跳出。下面是for的简单例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int nMax = 10;
    for (int i = 0; i < nMax; i++)
    {
        printf("%d\n", i);
    }

下面是它对应的汇编代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
9:        int nMax = 10;
00401268   mov         dword ptr [ebp-4],0Ah
10:       for (int i = 0; i < nMax; i++)
0040126F   mov         dword ptr [ebp-8],0 ;初始化循环变量
00401276   jmp         main+31h (00401281);跳转到比较操作处
00401278   mov         eax,dword ptr [ebp-8]
0040127B   add         eax,1
0040127E   mov         dword ptr [ebp-8],eax;这三句话实现的是循环变量自增操作
00401281   mov         ecx,dword ptr [ebp-8];ecx = i
00401284   cmp         ecx,dword ptr [ebp-4];比较ecx与i
00401287   jge         main+4Ch (0040129c);跳转到循环体外
11:       {
12:           printf("%d\n", i);
00401289   mov         edx,dword ptr [ebp-8]
0040128C   push        edx
0040128D   push        offset string "%d\n" (0042e01c)
00401292   call        printf (00401540)
00401297   add         esp,8
13:       }
0040129A   jmp         main+28h (00401278);跳转到i++位置
14:       return 0;
0040129C   xor         eax,eax

从上面的汇编代码可以看出for循环的效率最低,它经过了3次跳转,生成对应的汇编代码上,初始化操作后面紧接着是循环变量自增操作,所以首先在完成初始化后会进行一次跳转,跳转到判断,然后根据判断条件再次跳转或者接着执行循环体,最后当循环完成后会再次跳转到循环变量自增的位置,同样采用goto语句来模拟这个操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int nMax = 10;
    int i = 0;
    goto __CMP;
__ADD:
    i++;
__CMP:
    if (i >= nMax)
    {
        goto __RETURN;
    }

__LOOP:
    printf("%d\n", i);
    goto __ADD;
__RETURN:
    return 0;

continue语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
continue用于结束这次循环进入下一次循环,下面采用最复杂的for循环来说明continue语句:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int nMax = 10;
    int i = 0;
    for(;i < nMax; i++)
    {
        if (i == 6)
        {
            continue;
        }
    }

下面是它对应的汇编代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
00401268   mov         dword ptr [ebp-4],0Ah
10:       int i = 0;
0040126F   mov         dword ptr [ebp-8],0
11:       for(;i < nMax; i++)
00401276   jmp         main+31h (00401281)
00401278   mov         eax,dword ptr [ebp-8]
0040127B   add         eax,1
0040127E   mov         dword ptr [ebp-8],eax
00401281   mov         ecx,dword ptr [ebp-8]
00401284   cmp         ecx,dword ptr [ebp-4]
00401287   jge         main+43h (00401293)
12:       {
13:           if (i == 6)
00401289   cmp         dword ptr [ebp-8],6;
0040128D   jne         main+41h (00401291);条件不满足组跳转到循环结束处
14:           {
15:               continue;
0040128F   jmp         main+28h (00401278)
16:           }
17:       }
00401291   jmp         main+28h (00401278)
18:       return 0;
00401293   xor         eax,eax

从上面的汇编代码可以看到,continue语句也是一个跳转语句,它会直接跳转到循环体的开始位置。对于for来说相对特殊一些(我觉得循环变量自增并不属于循环体),由于第一次进入循环时并没有执行循环变量自增,所以它会跳转到循环变量自增的位置,其他则直接到循环开始处。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数组的剖析
C语言中数组是十分重要的一种结构,数组采用的是连续存储的方式,下面通过反汇编的方式来解析编译器对数组的操作。
Masimaro
2018/08/31
6450
Win32汇编:各种语句的构造方式
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王瑞MVP
2022/12/28
8910
Win32汇编:各种语句的构造方式
Win32汇编:各种语句的构造方式
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王瑞MVP
2022/12/22
5990
5.11 汇编语言:仿写IF条件语句
条件语句,也称为IF-ELSE语句,是计算机编程中的一种基本控制结构。它允许程序根据条件的真假来执行不同的代码块。条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键字和对应的代码块组成。条件表达式的结果通常是布尔值(True或False),决定了程序将执行IF代码块还是ELSE代码块。
王瑞MVP
2023/08/24
2280
5.11 汇编语言:仿写IF条件语句
条件语句,也称为IF-ELSE语句,是计算机编程中的一种基本控制结构。它允许程序根据条件的真假来执行不同的代码块。条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键字和对应的代码块组成。条件表达式的结果通常是布尔值(True或False),决定了程序将执行IF代码块还是ELSE代码块。
王瑞MVP
2023/10/11
6220
5.12 汇编语言:仿写While循环语句
循环语句(While)一种基本控制结构,它允许程序在条件为真的情况下重复执行一段代码块,直到条件为假为止。循环语句在处理需要重复执行的任务时非常有用,它可以让程序更加高效地处理大量数据或者重复性操作。
王瑞MVP
2023/08/24
4130
5.12 汇编语言:仿写While循环语句
循环语句(While)一种基本控制结构,它允许程序在条件为真的情况下重复执行一段代码块,直到条件为假为止。循环语句在处理需要重复执行的任务时非常有用,它可以让程序更加高效地处理大量数据或者重复性操作。
王瑞MVP
2023/10/11
2880
滴水逆向初级-C语言(二)
1、声明变量 变量类型变量名; 变量类型用来说明宽度是多大 int 4个字节 short 2个字节 char 1个字节
zhang_derek
2021/04/13
1.3K0
C++多态
面向对象的程序设计的三大要素之一就是多态,多态是指基类的指针指向不同的派生类,其行为不同。多态的实现主要是通过虚函数和虚表来完成,虚表保存在对象的头四个字节,要调用虚函数必须存在对象,也就是说虚函数必须作为类的成员函数来使用。 编译器为每个拥有虚函数的对象准备了一个虚函数表,表中存储了虚函数的地址,类对象在头四个字节中存储了虚函数表的指针。 下面是一个具体的例子
Masimaro
2019/02/25
3700
C语言与汇编的嵌入式编程:求100以内素数
 由于C语言中使用的是for进行循环,使用VC调试汇编时,发现for汇编的jmp需要具体地址才可以进行,对于程序来讲不方便
墨文
2020/02/28
2.1K0
C语言与汇编的嵌入式编程:求100以内素数
5.13 汇编语言:仿写For循环语句
循环语句(for)是计算机编程中的一种基本控制结构,它允许程序按照指定的次数或范围重复执行一段代码块。for循环在处理需要进行迭代操作的情况下非常有用,它使得程序可以更加方便地控制循环的次数。一般来说,for循环由三个部分组成:初始化部分、条件表达式和更新部分,以及一个需要重复执行的代码块。在每次循环迭代开始时,程序首先执行初始化部分,然后检查条件表达式的值,如果为真,则执行代码块,并在每次循环结束后执行更新部分。只要条件表达式为真,for循环就会一直重复执行;一旦条件表达式为假,循环将停止,程序继续执行循环之后的代码。
王瑞MVP
2023/08/24
2360
汇编角度看函数堆栈调用
带着以下一个问题来探索: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?从头开始还是从调用之后开始? (3)返回值是如何带出来的?
lexingsen
2022/02/24
6960
汇编角度看函数堆栈调用
从反汇编看恶意程序的C语言结构
本文利用IDA分析4个简单的恶意程序,旨在基本掌握这4个恶意程序的C语言逻辑结构,同时这4个程序功能逐渐递增,循序渐进。笔者也是初学者,有些不足之处在所难免,请师傅们斧正
亿人安全
2022/06/30
6060
从反汇编看恶意程序的C语言结构
5.10 汇编语言:汇编过程与结构
过程的实现离不开堆栈的应用,堆栈是一种后进先出(LIFO)的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。
王瑞MVP
2023/08/24
4940
5.10 汇编语言:汇编过程与结构
过程的实现离不开堆栈的应用,堆栈是一种后进先出(LIFO)的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。
王瑞MVP
2023/10/11
2470
C函数原理
C语言作为面向过程的语言,函数是其中最重要的部分,同时函数也是C种的一个难点,这篇文章希望通过汇编的方式说明函数的实现原理。
Masimaro
2018/08/31
6100
程序员需要了解的硬核知识之汇编语言(全)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
cxuan
2019/12/05
9820
IF和SWITCH的原理
在C语言中,if和switch是条件分支的重要组成部分。if的功能是计算判断条件的值,根据返回的值的不同来决定跳转到哪个部分。值为真则跳转到if语句块中,否则跳过if语句块。下面来分析一个简单的if实例:
Masimaro
2018/08/31
6850
PC逆向之代码还原技术,第四讲汇编中减法的代码还原
在讲解减法的代码还原之前.我们首先要知道. 减法在汇编中对应的指令是什么. Sub 汇编指令. Sub x,y 将x的值 加上y 并且重新赋值给x
IBinary
2019/05/25
6270
Win32汇编:字符串浮点数运算过程
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王瑞MVP
2022/12/22
6620
相关推荐
数组的剖析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验