C语言循环的机器级实现

do-while循环

下图实现了对x变量二进制数中1的个数的计数

  • do-while语句首先执行循环代码,然后再判断(不管条件是否满足,至少执行一次)
  • 说明:
  1. shrq指令为逻辑右移,当移位运算只有一个操作数时,默认移位数为1
  2. ret指令为过程返回指令,break、return语句均相当于跳转指令
  3. rep指令是字符串操作指令,当不涉及字符串相关操作时,rep指令配合另一个指令使用的话,相当于一条空指令。这样的意义在于流水线优化,因为连续两条跳转指令紧挨着排列可能影响流水线性能,故而在中间由空指令隔开

while循环的两种汇编语言模式

  • 需要在进入循环体前先判断循环条件是否成立
  • 一种汇编模式为jump-to-middle,使用-Og编译优化选项得到
  1. 与do-while类似,只不过在第一次循环前有跳转语句先跳转到条件判断位置做判断,满足后再进入循环,如下图
  2. 劣势:在执行前需进行两次跳转,而频繁进行跳转会导致系统性能下降

  • 另一种编码模式为while模式,使用-o1编译优化选项得到
  1. 也类似do-while,但在循环前先做循环条件检查
  2. 优势:在进入循环前不需要跳转,减少了跳转次数,提高了时间效率,但代码量会更多些

for循环

  • 由三个子语句组成:
  1. 第一个子语句只会在循环前执行,做循环变量的基本初始化
  2. 第二个子语句做循环条件检测
  3. 第三个子语句做循环变量更新,在每次循环体结束,进入下一次循环之前执行(第一次进入循环不执行)
  • 下图将for循环改造为while循环,进一步改造为do-while循环,最后改造为goto语句
  • for循环转换为等价while循环
  1. i=0进行循环变量初始化
  2. while后条件做循环变量的条件检测
  3. 在循环体后执行循环更新语句
  • 在部分for循环中,编译器可作进一步优化。由于wsize为常量,i的初始化为0也是常量,故i<wsize实际为常量运算,可以优化掉。值得注意的是,并不是所有for循环的条件判断都可优化,若wsize或i初始时为变量,则不可优化
关注公众号,让我们携手共进0.5.jpg
阅读 181

推荐阅读
目录