历史上的今天
返回首页

历史上的今天

今天是: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少了一条指令。


推荐阅读

史海拾趣

ARBOR公司的发展小趣事

ARBOR公司深知合作的重要性,积极与上下游企业建立紧密的合作关系。公司通过与供应商和客户建立长期稳定的战略合作关系,实现了资源共享和优势互补。这种合作模式不仅降低了公司的运营成本,也提高了产品的竞争力。同时,ARBOR公司还积极参与行业交流活动,推动整个电子产业的健康发展。

GS Technology公司的发展小趣事
将峰值检测电路的输出信号连接到荧光显示器的驱动电路上,驱动荧光材料发光以显示峰值。
Advanced Components Industries Inc公司的发展小趣事

Advanced Components Industries Inc(以下简称ACI)在电子行业的崛起,始于一次关键的技术突破。公司研发团队成功开发出一种新型的高效能电子元件,这一创新不仅提高了电子设备的性能,还降低了能耗。这一成果迅速吸引了市场的关注,ACI的订单量激增,公司开始迅速扩张。

随着技术的不断完善和市场的认可,ACI逐渐在电子元件领域建立了自己的品牌地位。公司不断投入研发,推出了一系列具有竞争力的产品,逐渐在行业中崭露头角。

GETEDZ ( HVGT)公司的发展小趣事
电路设计要便于维护和检修,方便在设备出现故障时能够迅速定位并解决问题。
Cypress Industries公司的发展小趣事

2020年,Cypress迎来了其发展历程中的一个重要时刻——与德国半导体巨头英飞凌(Infineon)的合并。这次合并使Cypress成为英飞凌的一部分,双方在技术、市场和资源等方面实现了互补和整合。这次合并不仅增强了Cypress在全球半导体市场的竞争力,也为其未来的发展提供了更广阔的空间。

以上故事均基于Cypress Semiconductor(赛普拉斯半导体)的发展历史而创作,旨在客观描述公司在电子行业中的发展历程和成就。

Electronic Sensor + Resistor GmbH公司的发展小趣事

在ESR公司的发展历程中,技术突破是推动其不断前进的重要动力。公司投入大量资源用于研发,不断推出具有创新性和竞争力的新产品。其中,一款基于纳米技术的微型传感器成为市场上的明星产品,其高精度、低功耗和快速响应的特性受到了用户的广泛好评。

此外,ESR公司还注重与高校和研究机构的合作,共同开展前沿技术的研发。这种产学研合作模式不仅为公司带来了源源不断的技术创新,也为公司培养了一批高素质的研发人才。

问答坊 | AI 解惑

第4/15原创:独立按键

事无巨细,独立键盘 经过多天的等待,元器件终于补齐了,虽然焊接的过程中出现了非常悲剧的事情,但最终我的板子得以“残”貌示人,就傻傻的高兴一下好了。 言归正传,今天写写独立按键的原理及编程方法。 按键是什么东西,我想这个就不必由我向 ...…

查看全部问答>

FPGA 的IO脚分配问题

我知道要FPGA工作要有一个flash ,可是如何连接FPGA和flash啊,还有怎么向flash里下载我写的那个模块啊? 我选的一个FPGA说有484个引脚可是为什么又说315个可用引脚啊? 我现在面临的问题主要是,FPGA里面的程序模块我已经写完了,可是现在要把它 ...…

查看全部问答>

“通用射频测量和EMC诊断测试解决方案”

海洋仪器诚邀您参加技术交流会 活动时间:2010年6月25日(星期五) 活动地点:北京湖北大厦贵宾楼二层楚宫 主办:德国罗德与施瓦茨公司(R&S公司)       北京海洋兴业科技有限公司 随着各种电子产品研发生 ...…

查看全部问答>

关于XtMapWidget的资料

哪位大侠能提供一下关于XtMapWidget这类函数的资料啊。…

查看全部问答>

怎么理解CPU只会做加法运算而不会乘除运算?

怎么理解CPU只会做加法运算而不会乘除运算?…

查看全部问答>

大家好,wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?

wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?…

查看全部问答>

求:RAPI自定义功能函数的使用方法???

如何在wince中实现自定义功能函数,能通过Rapi被PC程序调用? 我参考的Windows CE那本书上提供的例子代码尝试进行实现,可是PC就是调用不成功; 1、wince下dll实现后,拷贝在/windows目录下; 2、PC程序通过ceRapiInvoke函数调用; 3、PC程序进行 ...…

查看全部问答>

从事java开发的转向嵌入式开发困难吗?

从事java开发的转向嵌入式开发困难吗?两者是否有一些共通点呢?…

查看全部问答>

STM32F103VE引脚使用咨询

                                 STM32F103VE的那些I/O引脚可以承受5V电平?谢谢!…

查看全部问答>