新聞中心

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

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

        作者: 時間:2013-09-30 來源:網絡 收藏

        本文引用地址:http://www.104case.com/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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 东明县| 登封市| 合肥市| 合川市| 沅陵县| 封开县| 固阳县| 延长县| 大洼县| 平邑县| 孟村| 常州市| 龙里县| 孟连| 南汇区| 松滋市| 耒阳市| 将乐县| 贵溪市| 农安县| 偃师市| 漯河市| 桐城市| 五大连池市| 工布江达县| 故城县| 白玉县| 邵阳县| 扎赉特旗| 通河县| 璧山县| 曲阳县| 黔西县| 滦南县| 江口县| 津南区| 永嘉县| 渑池县| 文昌市| 上林县| 南开区|