×
研发技术 > 嵌入式 > 详情

高效的C编程之:C循环结构

发布时间:2022-10-21 发布时间:
|

  14.5  C循环结构

  循环体是程序设计与优化的重点考虑对象。本节将着重讲解在ARM上处理for和while循环最有效的方法。

  14.5.1  循环中止

  首先来看下面的例子,两个不同的循环退出条件,产生的不同汇编代码。

  C源程序如下所示。

  int fact1 (int n)

  {

  int i, fact = 1;

  for (i = 1; i <= n; i++)

  fact *= i;

  return (fact);

  }

  int fact2 (int n)

  {

  int i, fact = 1;

  for (i = n; i != 0; i--)

  fact *= i;

  return (fact);

  }

  产生的汇编代码如下所示。

  fact1

  MOV      a3,#1

  MOV      a2,#1

  CMP      a1,#1

  BLT      |L000020.J5.fact1|

  |L000010.J4.fact1|

  MUL      a3,a2,a3

  ADD      a2,a2,#1

  CMP      a2,a1

  BLE      |L000010.J4.fact1|

  |L000020.J5.fact1|

  MOV      a1,a3

  MOV      pc,lr

  fact2

  MOVS     a2,a1

  MOV      a1,#1

  MOVEQ    pc,lr

  |L000034.J4.fact2|

  MUL      a1,a2,a1

  SUBS     a2,a2,#1

  BNE      |L000034.J4.fact2|

  MOV      pc,lr

  从产生的汇编代码中,可以看出两个函数虽然实现的功能相同,但产生的代码效率却不尽相同。这里的关键是,循环的中止条件应为计数减到零(count down to zero),而不是计数增加到某个值。由于减计数结果已存储在条件标志里,与零比较的指令就可以省略。同时也可以少用一个寄存器来存储循环中止值。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
轻量级嵌入式GUI高级功能实现