精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>C語言|源代碼>高效的C編程之布爾表達式

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

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

資料介紹

14.4 布爾表達式
  14.4.1 范圍檢測
  通常,布爾表達式被用來檢測某個數值是否在特定的范圍內。例如,在圖形窗口處理程序中,常使用布爾表達式判斷屏幕中一個點是否在當前活動窗口范圍內。
  下面的程序使用結構體定義點坐標并計算坐標的當前位置。
  bool PointInRect1(Point p, Rectangle *r)
  { return (p.x 》= r-》xmin && p.x 《 r-》xmax &&
  p.y 》= r-》ymin && p.y 《 r-》ymax);
  }
  上面的功能函數,被編譯為下面的指令序列。
  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
  但上面的代碼并不是最精簡的。編譯器對(x 》= min && x 《 max)形式的布爾表達式的處理過程比較復雜。它將以(unsigned)(x-min) 《 (max-min)形式實現布爾操作。所有對于上面范圍判斷的代碼,建議將函數寫成如下形式。
  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)將設置程序狀態字的條件標志位。另外,基本的算術指令也可以設置條件標志位,如使用指令MOVS、ADDS等。如果程序中的算術指令的執行目的是為了將計算結果和零比較,那么就可以直接使用帶標志擴展的基本算術指令。如下面的兩條語句:
  ADD R0, R0, R1
  CMP R0, #0
  可以合并為一條帶符號擴展的加法指令:
  ADDS R0, R0, R1
  事實上,C語言中的和零相關的關系操作都可以利用狀態標志寄存器的N位和Z位。如:x 《 0, x 》= 0, x = 0, x != 0,和無符號操作x = 0, x != 0 (or x 》 0)。
  對于每一條C語言中的關系操作,匯編器都將產生一條比較指令。如果關系操作和零相關,則可以將產生的比較指令移除。
  下面是C語言中的關系操作被編譯的例子。
  C源文件如下所示。
  int g(int x, int y)
  {
  if ((x + y) 《 0)
  return 1;
  else
  return 0;
  }
  編譯后的結果如下。
  g
  ADDS a1,a1,a2
  MOVPL a1,#0
  MOVMI a1,#1
  MOV pc,lr
  所以,在使用C語言編程時,關系操作最好轉換成和零相關的,這樣既可以減少代碼密度,也可以提高程序的執行效率。
  C語言中,沒有和程序狀態寄存器的C位和V位直接相關的指令,所以要在程序中檢測這些標志,只能使用內嵌匯編。但C編譯器支持無符號溢出操作,下面的例子顯示了在有溢出操作時,編譯器對程序的處理。
  C源代碼如下所示。
  int sum(int x, int y)
  {
  int res;
  res = x + y;
  if ((unsigned) res 《 (unsigned) x) /* 判斷進位標志是否進位 */
  res++;
  return res;
  }
  編譯的匯編文件如下所示。
  sum
  ADDS a2,a1,a2
  ADC a2,a2,#0
  MOV a1,a2
  MOV pc,lr
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

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

本月

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

總榜

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