色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

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

          14.4

          14.4.1范圍檢測

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

          下面的程序使用結(jié)構(gòu)體定義點坐標(biāo)并計算坐標(biāo)的當(dāng)前位置。

          boolPointInRect1(Pointp,Rectangle*r)

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

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

          }

          上面的功能函數(shù),被編譯為下面的指令序列。

          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)形式的布爾表達式的處理過程比較復(fù)雜。它將以(unsigned)(x-min)(max-min)形式實現(xiàn)布爾操作。所有對于上面范圍判斷的代碼,建議將函數(shù)寫成如下形式。

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

          ADDR0,R0,R1

          CMPR0,#0

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

          ADDSR0,R0,R1

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

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


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉