• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

    高效的C編程之:布爾表達(dá)式

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

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

    14.4

    14.4.1范圍檢測(cè)

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

    下面的程序使用結(jié)構(gòu)體定義點(diǎn)坐標(biāo)并計(jì)算坐標(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

    但上面的代碼并不是最精簡(jiǎn)的。編譯器對(duì)(x>=minxmax)形式的布爾表達(dá)式的處理過(guò)程比較復(fù)雜。它將以(unsigned)(x-min)(max-min)形式實(shí)現(xiàn)布爾操作。所有對(duì)于上面范圍判斷的代碼,建議將函數(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)將設(shè)置程序狀態(tài)字的條件標(biāo)志位。另外,基本的算術(shù)指令也可以設(shè)置條件標(biāo)志位,如使用指令MOVS、ADDS等。如果程序中的算術(shù)指令的執(zhí)行目的是為了將計(jì)算結(jié)果和零比較,那么就可以直接使用帶標(biāo)志擴(kuò)展的基本算術(shù)指令。如下面的兩條語(yǔ)句:

    ADDR0,R0,R1

    CMPR0,#0

    可以合并為一條帶符號(hào)擴(kuò)展的加法指令:

    ADDSR0,R0,R1

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

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


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

    評(píng)論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 乐平市| 平果县| 铜鼓县| 弋阳县| 自治县| 秭归县| 江达县| 山阴县| 金秀| 米林县| 分宜县| 富裕县| 论坛| 南丰县| 津南区| 中江县| 嫩江县| 万源市| 铁力市| 德保县| 苏尼特左旗| 洛川县| 九江市| 丁青县| 梁平县| 商城县| 黔西县| 建始县| 莆田市| 星座| 潼关县| 龙里县| 财经| 海林市| 且末县| 建湖县| 西藏| 禹州市| 灯塔市| 莱芜市| 张家界市|