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),而不是计数增加到某个值。由于减计数结果已存储在条件标志里,与零比较的指令就可以省略。同时也可以少用一个寄存器来存储循环中止值。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』