循环结构
除了分支结构,循环结构也是高级语言中基础且重要的结构,常见的如for循环、while循环,do .. while循环结构等。对于循环结构,判断其是否达到结束条件是非常重要的一步,所以如果你掌握了上述分支结构的汇编实现,那么循环结构的汇编实现就变的非常简单了,如下表所示。
C程序实现 |
汇编实现 |
---|---|
for(i = 0; i < end; i++){ … … (loop body) … … } |
/* Assume the values of i and end are stored in registers name-defined as reg_i and reg_end. */ b LoopCond LoopStart: ... ... (loop body) ... ... LoopCond: cmp reg_i, reg_end b.le LoopStart |
while (i < end) { ... ... (loop body) ... ... } |
|
do { ... ... (loop body) ... ... i++; } while (i < end); |
… … LoopStart: ... ... (loop body) ... ... LoopCond: cmp reg_i, reg_end b.le LoopStart |
从分支结构想向循环结构转变的关键就在于条件判断和循环体入口的确定,当分支判断跳转的目标之一为循环体入口就可以实现循环结构了。
从上述实现来看,for循环结构和while循环结构的汇编转换是没有差别的,而这两者与do .. while循环结构的区别也仅在于通过第一次跳转判断是否要实现执行一次循环体内容。我们很乐观的假设在应用中很少会存在第一次就不满足循环条件的情况,所以在实际汇编实现中更倾向于do .. while的循环结构,因为相差的这一次跳转判断可能会带来性能上不一样的结果。