热门标签 | 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 赋新值  执行条件判断  打印输出等语句   赋新值 ......


推荐阅读
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • KMP算法是一种高效的字符串模式匹配算法,能够在不进行回溯的情况下完成匹配,其时间复杂度为O(m+n),其中m和n分别为文本串和模式串的长度。本文将详细介绍KMP算法的工作原理,并提供C语言实现。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • C语言实现推箱子游戏的完整代码
    本文详细介绍了如何使用C语言在Linux环境下实现一个简单的推箱子游戏,包括游戏的基本规则、地图设计及代码实现。适合C语言初学者学习。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
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社区 版权所有