新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 高效的C编程之:布尔表达式

高效的C编程之:布尔表达式

作者:时间:2013-09-30来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257021.htm

14.4

14.4.1范围检测

通常,被用来检测某个数值是否在特定的范围内。例如,在图形窗口处理程序中,常使用判断屏幕中一个点是否在当前活动窗口范围内。

下面的程序使用结构体定义点坐标并计算坐标的当前位置。

boolPointInRect1(Pointp,Rectangle*r)

{return(p.x>=r->xminp.xr->xmax

p.y>=r->yminp.yr->ymax);

}

上面的功能函数,被编译为下面的指令序列。

PointInRect1

LDRa4,[a3,#0]

CMPa1,a4

BLT|L000034.J5.PointInRect1|

LDRa4,[a3,#4]

CMPa4,a1

BLE|L000034.J5.PointInRect1|

LDRa1,[a3,#8]

CMPa2,a1

BLT|L000034.J5.PointInRect1|

LDRa1,[a3,#c]!

CMPa2,a1

MOVLTa1,#1

MOVLTpc,lr

|L000034.J5.PointInRect1|

MOVa1,#0

MOVpc,lr

但上面的代码并不是最精简的。编译器对(x>=minxmax)形式的布尔表达式的处理过程比较复杂。它将以(unsigned)(x-min)(max-min)形式实现布尔操作。所有对于上面范围判断的代码,建议将函数写成如下形式。

boolPointInRect2(Pointp,Rectangle*r)

{return((unsigned)(p.x-r->xmin)r->xmax

(unsigned)(p.y-r->ymin)r->ymax);

}

这样编译出的汇编指令序列如下所示。

PointInRect2

LDRa4,[a3,#0]

SUBa1,a1,a4

LDRa4,[a3,#4]

CMPa1,a4

LDRCCa1,[a3,#8]

SUBCCa1,a2,a1

LDRCCa2,[a3,#c]!

CMPCCa1,a2

MOVCSa1,#0

MOVCCa1,#1

MOVpc,lr

14.4.2和零的比较操作

(CMP)将设置程序状态字的条件标志位。另外,基本的算术指令也可以设置条件标志位,如使用指令MOVS、ADDS等。如果程序中的算术指令的执行目的是为了将计算结果和零比较,那么就可以直接使用带标志扩展的基本算术指令。如下面的两条语句:

ADDR0,R0,R1

CMPR0,#0

可以合并为一条带符号扩展的加法指令:

ADDSR0,R0,R1

事实上,C语言中的和零相关的关系操作都可以利用状态标志寄存器的N位和Z位。如:x0,x>=0,x=0,x!=0,和无符号操作x=0,x!=0(orx>0)。

对于每一条C语言中的关系操作,汇编器都将产生一条。如果关系操作和零相关,则可以将产生的移除。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭