<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 高效的C編程之:布爾表達式

高效的C編程之:布爾表達式

作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257021.htm

14.4

14.4.1范圍檢測

通常,被用來(lái)檢測某個(gè)數值是否在特定的范圍內。例如,在圖形窗口處理程序中,常使用判斷屏幕中一個(gè)點(diǎn)是否在當前活動(dòng)窗口范圍內。

下面的程序使用結構體定義點(diǎn)坐標并計算坐標的當前位置。

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

但上面的代碼并不是最精簡(jiǎn)的。編譯器對(x>=minxmax)形式的布爾表達式的處理過(guò)程比較復雜。它將以(unsigned)(x-min)(max-min)形式實(shí)現布爾操作。所有對于上面范圍判斷的代碼,建議將函數寫(xiě)成如下形式。

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)將設置程序狀態(tài)字的條件標志位。另外,基本的算術(shù)指令也可以設置條件標志位,如使用指令MOVS、ADDS等。如果程序中的算術(shù)指令的執行目的是為了將計算結果和零比較,那么就可以直接使用帶標志擴展的基本算術(shù)指令。如下面的兩條語(yǔ)句:

ADDR0,R0,R1

CMPR0,#0

可以合并為一條帶符號擴展的加法指令:

ADDSR0,R0,R1

事實(shí)上,C語(yǔ)言中的和零相關(guān)的關(guān)系操作都可以利用狀態(tài)標志寄存器的N位和Z位。如:x0,x>=0,x=0,x!=0,和無(wú)符號操作x=0,x!=0(orx>0)。

對于每一條C語(yǔ)言中的關(guān)系操作,匯編器都將產(chǎn)生一條。如果關(guān)系操作和零相關(guān),則可以將產(chǎn)生的移除。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>