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版下的特性。
总结:
- mov mem/reg, xxx ; 赋初值
- jmp FOR_CMP ; 跳到循环条件判定部分
- FOR_STEP: ; 步长计算部分
- ; 修改循环变量Step
- mov reg, Step
- add reg,xxxx ; 修改循环变量的计算过程,在实际分析中,视算法不同而不同
- mov Step,eax
- FOR_CMP: ; 循环条件判定部分
- mov ecx,dword ptr Step
- ; 判定循环变量和循环终止条件StepEnd 的关系,满足条件则退出for循环
- cmp ecx, StepEnd
- jxx FOR_END ; 条件成立则结束循环
- ……
- jmp FOR_STEP ; 向上跳转,修改流程回到步长计算部分
- FOR_END:
遇到以上代码块,即可判定它为一个for循环结构。这种结构是for循环独有的,在计数器变量被赋初值后,利用jmp跳过第一次步长计算。然后,可以通过三个跳转指令还原for循环的各个组成部分:第一个jmp指令之前的代码为初始化部分;从第一个jmp指令到循环条件比较处(也就是上面代码中FOR_CMP标号的位置)之间的代码为步长计算部分;在条件跳转指令jxx之后寻找一个jmp指令,这jmp指令必须是向上跳转的,且其目标是到步长计算的位置,在jxx和这个jmp(也就是上面代码中省略号所在的位置)之间的代码即为循环语句块。
在这三种循环结构中,while循环和for循环一样,都是先判断再循环。由于需要先判断,因此需要将判断语句放置在循环语句之前,这就使while循环和for循环在结构上没有do循环那么简洁。那么在效率上这三个循环之间又有哪些区别呢?下一节将分析这三者间的效率对比。