do-while循环
下图实现了对x变量二进制数中1的个数的计数
- do-while语句首先执行循环代码,然后再判断(不管条件是否满足,至少执行一次)
- 说明:
- shrq指令为逻辑右移,当移位运算只有一个操作数时,默认移位数为1
- ret指令为过程返回指令,break、return语句均相当于跳转指令
- rep指令是字符串操作指令,当不涉及字符串相关操作时,rep指令配合另一个指令使用的话,相当于一条空指令。这样的意义在于流水线优化,因为连续两条跳转指令紧挨着排列可能影响流水线性能,故而在中间由空指令隔开
while循环的两种汇编语言模式
- 需要在进入循环体前先判断循环条件是否成立
- 一种汇编模式为jump-to-middle,使用-Og编译优化选项得到
- 与do-while类似,只不过在第一次循环前有跳转语句先跳转到条件判断位置做判断,满足后再进入循环,如下图
- 劣势:在执行前需进行两次跳转,而频繁进行跳转会导致系统性能下降
- 另一种编码模式为while模式,使用-o1编译优化选项得到
- 也类似do-while,但在循环前先做循环条件检查
- 优势:在进入循环前不需要跳转,减少了跳转次数,提高了时间效率,但代码量会更多些
for循环
- 由三个子语句组成:
- 第一个子语句只会在循环前执行,做循环变量的基本初始化
- 第二个子语句做循环条件检测
- 第三个子语句做循环变量更新,在每次循环体结束,进入下一次循环之前执行(第一次进入循环不执行)
- 下图将for循环改造为while循环,进一步改造为do-while循环,最后改造为goto语句
- for循环转换为等价while循环
- i=0进行循环变量初始化
- while后条件做循环变量的条件检测
- 在循环体后执行循环更新语句
- 在部分for循环中,编译器可作进一步优化。由于wsize为常量,i的初始化为0也是常量,故i<wsize实际为常量运算,可以优化掉。值得注意的是,并不是所有for循环的条件判断都可优化,若wsize或i初始时为变量,则不可优化
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。