历史上的今天
今天是:2025年04月07日(星期一)
2021年04月07日 | 高效的C编程之: C循环结构(上)
2021-04-07 来源:eefocus
简介:循环体是程序设计与优化的重点考虑对象。本节将着重讲解在ARM上处理for和while循环最有效的方法。(EEFOCUS)
14.5C循环结构
循环体是程序设计与优化的重点考虑对象。本节将着重讲解在ARM上处理for和while循环最有效的方法。
14.5.1循环中止
首先来看下面的例子,两个不同的循环退出条件,产生的不同汇编代码。
C源程序如下所示。
intfact1(intn)
{
inti,fact=1;
for(i=1;i<=n;i++)
fact*=i;
return(fact);
}
intfact2(intn)
{
inti,fact=1;
for(i=n;i!=0;i--)
fact*=i;
return(fact);
}
产生的汇编代码如下所示。
fact1
MOVa3,#1
MOVa2,#1
CMPa1,#1
BLT|L000020.J5.fact1|
|L000010.J4.fact1|
MULa3,a2,a3
ADDa2,a2,#1
CMPa2,a1
BLE|L000010.J4.fact1|
|L000020.J5.fact1|
MOVa1,a3
MOVpc,lr
fact2
MOVSa2,a1
MOVa1,#1
MOVEQpc,lr
|L000034.J4.fact2|
MULa1,a2,a1
SUBSa2,a2,#1
BNE|L000034.J4.fact2|
MOVpc,lr
从产生的汇编代码中,可以看出两个函数虽然实现的功能相同,但产生的代码效率却不尽相同。这里的关键是,循环的中止条件应为计数减到零(countdowntozero),而不是计数增加到某个值。由于减计数结果已存储在条件标志里,与零比较的指令就可以省略。同时也可以少用一个寄存器来存储循环中止值。
注意
上面的例子使用了-O2–Otime的编译选项,如果使用-Ospace选项,编译结果会有不同。
对循环计数值i来说,如果i是无符号的,则循环继续的条件既可以是i!=0,也可以是i>0。由于i不可能是负数,所以这两个条件是等价的。而对一个有符号的循环计数值来说,最好不要用条件i>0作为循环继续执行的条件。如果使用i>0作为循环继续执行的条件,编译器将生成下面的代码。
SUBa2,a2,#1
CMPr1,#0
BGT|L000034.J4.fact2|
这时,编译器多增加了一条CMP指令,主要是为了防止有符号数i=−0x8000000。总之,无论对于有符号还是无符号的循环计数值,都应该使用i!=0作为循环的结束条件。对于有符号数i,这比使用i>0少了一条指令。
上一篇:ARM开发板不能挂载U盘问题解决
史海拾趣
|
事无巨细,独立键盘 经过多天的等待,元器件终于补齐了,虽然焊接的过程中出现了非常悲剧的事情,但最终我的板子得以“残”貌示人,就傻傻的高兴一下好了。 言归正传,今天写写独立按键的原理及编程方法。 按键是什么东西,我想这个就不必由我向 ...… 查看全部问答> |
|
我知道要FPGA工作要有一个flash ,可是如何连接FPGA和flash啊,还有怎么向flash里下载我写的那个模块啊? 我选的一个FPGA说有484个引脚可是为什么又说315个可用引脚啊? 我现在面临的问题主要是,FPGA里面的程序模块我已经写完了,可是现在要把它 ...… 查看全部问答> |
|
海洋仪器诚邀您参加技术交流会 活动时间:2010年6月25日(星期五) 活动地点:北京湖北大厦贵宾楼二层楚宫 主办:德国罗德与施瓦茨公司(R&S公司) 北京海洋兴业科技有限公司 随着各种电子产品研发生 ...… 查看全部问答> |
|
大家好,wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢? wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?… 查看全部问答> |
|
如何在wince中实现自定义功能函数,能通过Rapi被PC程序调用? 我参考的Windows CE那本书上提供的例子代码尝试进行实现,可是PC就是调用不成功; 1、wince下dll实现后,拷贝在/windows目录下; 2、PC程序通过ceRapiInvoke函数调用; 3、PC程序进行 ...… 查看全部问答> |




