電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>C語(yǔ)言|源代碼>高效的C編程之布爾表達(dá)式

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

2017-10-17 | rar | 0.3 MB | 次下載 | 1積分

資料介紹

14.4 布爾表達(dá)式
  14.4.1 范圍檢測(cè)
  通常,布爾表達(dá)式被用來(lái)檢測(cè)某個(gè)數(shù)值是否在特定的范圍內(nèi)。例如,在圖形窗口處理程序中,常使用布爾表達(dá)式判斷屏幕中一個(gè)點(diǎn)是否在當(dāng)前活動(dòng)窗口范圍內(nèi)。
  下面的程序使用結(jié)構(gòu)體定義點(diǎn)坐標(biāo)并計(jì)算坐標(biāo)的當(dāng)前位置。
  bool PointInRect1(Point p, Rectangle *r)
  { return (p.x 》= r-》xmin && p.x 《 r-》xmax &&
  p.y 》= r-》ymin && p.y 《 r-》ymax);
  }
  上面的功能函數(shù),被編譯為下面的指令序列。
  PointInRect1
  LDR a4,[a3,#0]
  CMP a1,a4
  BLT |L000034.J5.PointInRect1|
  LDR a4,[a3,#4]
  CMP a4,a1
  BLE |L000034.J5.PointInRect1|
  LDR a1,[a3,#8]
  CMP a2,a1
  BLT |L000034.J5.PointInRect1|
  LDR a1,[a3,#&c]!
  CMP a2,a1
  MOVLT a1,#1
  MOVLT pc,lr
  |L000034.J5.PointInRect1|
  MOV a1,#0
  MOV pc,lr
  但上面的代碼并不是最精簡(jiǎn)的。編譯器對(duì)(x 》= min && x 《 max)形式的布爾表達(dá)式的處理過程比較復(fù)雜。它將以(unsigned)(x-min) 《 (max-min)形式實(shí)現(xiàn)布爾操作。所有對(duì)于上面范圍判斷的代碼,建議將函數(shù)寫成如下形式。
  bool PointInRect2(Point p, Rectangle *r)
  { return ((unsigned) (p.x - r-》xmin) 《 r-》xmax &&
  (unsigned) (p.y - r-》ymin) 《 r-》ymax);
  }
  這樣編譯出的匯編指令序列如下所示。
  PointInRect2
  LDR a4,[a3,#0]
  SUB a1,a1,a4
  LDR a4,[a3,#4]
  CMP a1,a4
  LDRCC a1,[a3,#8]
  SUBCC a1,a2,a1
  LDRCC a2,[a3,#&c]!
  CMPCC a1,a2
  MOVCS a1,#0
  MOVCC a1,#1
  MOV pc,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ǔ)句:
  ADD R0, R0, R1
  CMP R0, #0
  可以合并為一條帶符號(hào)擴(kuò)展的加法指令:
  ADDS R0, R0, R1
  事實(shí)上,C語(yǔ)言中的和零相關(guān)的關(guān)系操作都可以利用狀態(tài)標(biāo)志寄存器的N位和Z位。如:x 《 0, x 》= 0, x = 0, x != 0,和無(wú)符號(hào)操作x = 0, x != 0 (or x 》 0)。
  對(duì)于每一條C語(yǔ)言中的關(guān)系操作,匯編器都將產(chǎn)生一條比較指令。如果關(guān)系操作和零相關(guān),則可以將產(chǎn)生的比較指令移除。
  下面是C語(yǔ)言中的關(guān)系操作被編譯的例子。
  C源文件如下所示。
  int g(int x, int y)
  {
  if ((x + y) 《 0)
  return 1;
  else
  return 0;
  }
  編譯后的結(jié)果如下。
  g
  ADDS a1,a1,a2
  MOVPL a1,#0
  MOVMI a1,#1
  MOV pc,lr
  所以,在使用C語(yǔ)言編程時(shí),關(guān)系操作最好轉(zhuǎn)換成和零相關(guān)的,這樣既可以減少代碼密度,也可以提高程序的執(zhí)行效率。
  C語(yǔ)言中,沒有和程序狀態(tài)寄存器的C位和V位直接相關(guān)的指令,所以要在程序中檢測(cè)這些標(biāo)志,只能使用內(nèi)嵌匯編。但C編譯器支持無(wú)符號(hào)溢出操作,下面的例子顯示了在有溢出操作時(shí),編譯器對(duì)程序的處理。
  C源代碼如下所示。
  int sum(int x, int y)
  {
  int res;
  res = x + y;
  if ((unsigned) res 《 (unsigned) x) /* 判斷進(jìn)位標(biāo)志是否進(jìn)位 */
  res++;
  return res;
  }
  編譯的匯編文件如下所示。
  sum
  ADDS a2,a1,a2
  ADC a2,a2,#0
  MOV a1,a2
  MOV pc,lr
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費(fèi)下載
  2. 0.00 MB  |  1490次下載  |  免費(fèi)
  3. 2單片機(jī)典型實(shí)例介紹
  4. 18.19 MB  |  92次下載  |  1 積分
  5. 3S7-200PLC編程實(shí)例詳細(xì)資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識(shí)別和講解說(shuō)明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關(guān)電源原理及各功能電路詳解
  10. 0.38 MB  |  10次下載  |  免費(fèi)
  11. 6基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
  12. 0.11 MB  |  4次下載  |  免費(fèi)
  13. 7藍(lán)牙設(shè)備在嵌入式領(lǐng)域的廣泛應(yīng)用
  14. 0.63 MB  |  3次下載  |  免費(fèi)
  15. 89天練會(huì)電子電路識(shí)圖
  16. 5.91 MB  |  3次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費(fèi)
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費(fèi)
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費(fèi)
  7. 4LabView 8.0 專業(yè)版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費(fèi)
  9. 5555集成電路應(yīng)用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費(fèi)
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費(fèi)
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費(fèi)
  15. 8開關(guān)電源設(shè)計(jì)實(shí)例指南
  16. 未知  |  21539次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537791次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233045次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191183次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183277次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138039次下載  |  免費(fèi)