热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

for循环语句的头部执行顺序--汇编语言分析

最近因为在准备面试,所以看了不少面试题。每个都仔细分析,争取不留死角并解决自己的所有疑惑,同时也提高编程水平。今天偶然发现对for循环语句的头部执行顺序还有一点小疑惑,虽然经常使用,但往

       最近因为在准备面试,所以看了不少面试题。每个都仔细分析,争取不留死角并解决自己的所有疑惑,同时也提高编程水平。今天偶然发现对for循环语句的头部执行顺序还有一点小疑惑,虽然经常使用,但往往不太关注某些具体细节。因为是搞嵌入式的,所以对底层细节还是熟悉一点比较好。通过在网上查阅资料发现不少对此知识点的解读,但往往仅就C语言本身进行讲解,没有解释底层实现情况。大学期间学过微机原理,所以对汇编语言也有些了解,前不久在CSDN上看了赵中老师的“C语言指针与汇编内存地址”,最近对汇编级的调试挺感兴趣,所以今天我准备就for循环语句的汇编级实现进行介绍。

       以下程序编写调试的开发环境为Microsoft Visual Studio Professional 2015,所有结果及结论仅适用于本开发环境,其它开发环境的实现情况未亲自测试,在此不做评价。首先编写了一个C语言小程序如下:

#include

char i;

int main()
{

for (i = 0; i <2; i++)
{
printf("hello world\n");
}
}

最初我所理解的执行顺序是:i=0赋值 → 打印输出 → i++ → i<2进行判断 → 打印输出 → i++ →   i<2进行判断 → 打印输出 → i++  ......(红色为一个循环)这样最终执行两次输出,与程序运行输出结果一致。但在反汇编中却发现并不是这样运行的。按F11进行单步调试发现执行顺序如下图,图中printf函数一步跳过执行:

汇编指令的解释在此不做过多介绍。由图可知,首先执行“ mov     byte ptr [i (0F58139h)], 0 ” 即给 i 赋值,i=0,然后程序跳转执行i<2判断语句,之后执行打印输出语句,接着执行i++操作,再进行i<2比较,接着打印输出......这样程序执行流程为: i=0赋值 → i<2进行判断 → 打印输出 → i++ →i<2进行判断 → 打印输出 → i++ →  ......(红色为一个循环)这样最终也执行两次输出,与程序运行输出结果一致。可见我之前的理解是错误的,之所以运行结果一致仅仅是巧合,如果是 for (i = 0; i <0; i++) 则执行结果不一致。只不过这种情况往往很少见到。综上所述,for循环语句的头部执行顺序为(至少在本开发环境中是这样的):

i 初始赋值  执行条件判断   打印输出等语句   i 赋新值  执行条件判断  打印输出等语句   赋新值 ......


推荐阅读
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 深入浅出C语言指针
    指针是C语言中极其重要的数据类型,广泛应用于各种数据结构的表示、数组和字符串的操作以及内存地址的处理。本文将通过实例详细解析指针的基本概念及其应用。 ... [详细]
  • 本文详细介绍了在单片机编程中常用的几个C库函数,包括printf、memset、memcpy、strcpy和atoi,并提供了具体的使用示例和注意事项。 ... [详细]
  • 首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析
    首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析 ... [详细]
  • Java中字符串截取方法详解
    本文详细介绍了Java中常用的字符串截取方法及其应用场景,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 本文将深入探讨C语言代码的可重用性,解释其重要性和实现方法。通过具体示例,我们将展示如何通过封装和模块化设计提高代码的可重用性。 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
  • C语言中的指针详解
    1.什么是指针C语言中指针是一种数据类型,指针是存放数据的内存单元地址。计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节, ... [详细]
  • Java中的引用类型详解
    本文详细介绍了Java中的引用类型,包括强引用、软引用、弱引用和虚引用的特点和应用场景。 ... [详细]
  • Java 基础数据类型及其存储大小与取值范围
    本文介绍了 Java 中的八种基础数据类型,包括 byte、char、short、int、long、float、double 和 boolean,并详细说明了每种类型的存储大小和取值范围。 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
author-avatar
LMS柳树_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有