设为首页 加入收藏

TOP

5.7 do/while/for的比较(3)
2013-10-07 14:29:49 来源: 作者: 【 】 浏览:58
Tags:5.7 do/while/for 比较

5.7 do/while/for的比较(3)

代码清单5-24演示了for循环结构在Debug调试版下的汇编代码组成。需要由3次跳转来完成循环过程,其中一次为条件比较跳转,另外两次为jmp跳转。for循环结构为什么要设计得如此复杂呢?由于for循环分为赋初值、设置循环条件、设置循环步长这三个部分,为了可以单步调试程序,将汇编代码与源码进行一一对应,因此在Debug版下有了这样的设计,其循环流程如图5-12所示。

 
图5-12 for循环结构流程图

根据对代码清单5-24及图5-12中for循环流程的分析,总结出for循环结构在Debug版下的特性。

总结:

  1. mov     mem/reg, xxx                ; 赋初值  
  2. jmp     FOR_CMP                 ; 跳到循环条件判定部分  
  3. FOR_STEP:                           ; 步长计算部分  
  4. ; 修改循环变量Step  
  5. mov     reg, Step  
  6. add     reg,xxxx ; 修改循环变量的计算过程,在实际分析中,视算法不同而不同  
  7. mov     Step,eax  
  8. FOR_CMP:                            ; 循环条件判定部分  
  9. mov     ecx,dword ptr Step  
  10. ; 判定循环变量和循环终止条件StepEnd 的关系,满足条件则退出for循环  
  11. cmp     ecx, StepEnd  
  12. jxx     FOR_END                 ; 条件成立则结束循环  
  13. ……  
  14. jmp     FOR_STEP                    ; 向上跳转,修改流程回到步长计算部分  
  15. FOR_END: 

遇到以上代码块,即可判定它为一个for循环结构。这种结构是for循环独有的,在计数器变量被赋初值后,利用jmp跳过第一次步长计算。然后,可以通过三个跳转指令还原for循环的各个组成部分:第一个jmp指令之前的代码为初始化部分;从第一个jmp指令到循环条件比较处(也就是上面代码中FOR_CMP标号的位置)之间的代码为步长计算部分;在条件跳转指令jxx之后寻找一个jmp指令,这jmp指令必须是向上跳转的,且其目标是到步长计算的位置,在jxx和这个jmp(也就是上面代码中省略号所在的位置)之间的代码即为循环语句块。

在这三种循环结构中,while循环和for循环一样,都是先判断再循环。由于需要先判断,因此需要将判断语句放置在循环语句之前,这就使while循环和for循环在结构上没有do循环那么简洁。那么在效率上这三个循环之间又有哪些区别呢?下一节将分析这三者间的效率对比。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.8 编译器对循环结构的优化(1) 下一篇5.7 do/while/for的比较(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: