電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>C語(yǔ)言|源代碼>高效的C編程之除法運(yùn)算

高效的C編程之除法運(yùn)算

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

資料介紹

14.2 除法運(yùn)算
  因?yàn)?a target='_blank' class='arckwlink_none'>ARM體系結(jié)構(gòu)本身并不包含除法運(yùn)算硬件,所以在ARM上實(shí)現(xiàn)除法是十分耗時(shí)的。ARM指令集中沒(méi)有直接提供除法匯編指令,當(dāng)代碼中出現(xiàn)除法運(yùn)算時(shí),ARM編譯器會(huì)調(diào)用C庫(kù)函數(shù)(有符合除法調(diào)用_rt_sdiv,無(wú)符合除法調(diào)用_rt_udiv),來(lái)實(shí)現(xiàn)除法操作。根據(jù)除數(shù)和被除數(shù)的不同,32bit的除法運(yùn)算一般要占有20-140個(gè)指令周期。除法運(yùn)算占用的指令周期,由下面公式計(jì)算。
  Time(除數(shù)n / 被除數(shù)d)
  = C0 + C1 * log2(除數(shù)n / 被除數(shù)d) =
  = C0 + C1 * (log2(除數(shù)) -log2(被除數(shù)))。
  為了避免在程序中出現(xiàn)除法操作,編程時(shí)盡量使用其他運(yùn)算來(lái)代替除法操作。如,使用x》(z×y)來(lái)代替(x/y)》z。
  另外,在無(wú)法避免的除法運(yùn)算中,盡量使用無(wú)符合除法代替有符號(hào)除法。這是因?yàn)樵贏RM庫(kù)函數(shù)中,無(wú)符合除法的運(yùn)算速度要快于有符合除法。
  下面章節(jié)將詳細(xì)討論如何在代碼中提高除法運(yùn)算的執(zhí)行效率。
  14.2.1 合并除法和求余運(yùn)算
  ARM的除法運(yùn)算庫(kù)函數(shù)能同時(shí)返回運(yùn)算的商和余數(shù)。
  在一些同時(shí)需要商和余數(shù)的情況下,編譯器將調(diào)用一次除法運(yùn)算函數(shù)同時(shí)存儲(chǔ)運(yùn)算的商和余數(shù)。
  下面是一個(gè)編譯器調(diào)用除法庫(kù),同時(shí)存儲(chǔ)運(yùn)算的商和余數(shù)的例子。
  源程序如下。
  int combined_div_mod (int a, int b)
  {
  return (a / b) + (a % b);
  }
  下面是編譯器編譯出的匯編代碼。
  combined_div_mod
  STMDB sp!,{lr}
  MOV a3,a2
  MOV a2,a1
  MOV a1,a3
  BL __rt_sdiv
  ADD a1,a1,a2
  LDMIA sp!,{pc}
  從上面的例子可以看出,調(diào)用一次除法運(yùn)算,同時(shí)返回了商和余數(shù)。
  14.2.2 使用2的整數(shù)次冪做除數(shù)
  當(dāng)2的整數(shù)次冪做除數(shù)時(shí),編譯器會(huì)自動(dòng)將除法運(yùn)算轉(zhuǎn)換成移位運(yùn)算。所以在編寫(xiě)程序算法時(shí),盡量使用2的整數(shù)次冪做除數(shù)。
  下面的例子顯示了編譯器對(duì)除法運(yùn)算的自動(dòng)優(yōu)化。
  源程序如下。
  typedef unsigned int uint;
  uint div16u (uint a)
  { return a / 16;
  }
  int div16s (int a)
  { return a / 16;
  }
  編譯器的編譯結(jié)果如下。
  div16u
  MOV a1,a1,LSR #4
  MOV pc,lr
  div16s
  CMP a1,#0
  ADDLT a1,a1,#&f
  MOV a1,a1,ASR #4
  MOV pc,lr
  從上面的例子可以看出,無(wú)符號(hào)除法的運(yùn)算速度快于有符號(hào)除法。
  14.2.3 求余運(yùn)算
  為了避免在程序中使用除法運(yùn)算,可以將一些典型的求余運(yùn)算進(jìn)行轉(zhuǎn)換。下面的例子提供一種轉(zhuǎn)換方法。
  uint counter1 (uint count)
  { return (++count % 60);
  }
  轉(zhuǎn)換成,
  uint counter2 (uint count)
  { if (++count 》= 60)
  count = 0;
  return (count);
  }
  下面是兩個(gè)功能函數(shù)編譯后的匯編代碼。
  counter1
  STMDB sp!,{lr}
  ADD a2,a1,#1
  MOV a1,#&3c
  BL __rt_udiv
  MOV a1,a2
  LDMIA sp!,{pc}
  counter2
  ADD a1,a1,#1
  CMP a1,#&3c
  MOVCS a1,#0
  MOV pc,lr
  上面的例子清晰的顯示了使用if語(yǔ)句代替除法運(yùn)算后,代碼的執(zhí)行效率有很大提高。
  14.2.4 除數(shù)是常數(shù)的除法
  因?yàn)槌ê湍_\(yùn)算執(zhí)行起來(lái)比較慢,所以應(yīng)該盡可能地避免使用。但是除數(shù)是常數(shù)的除法運(yùn)算和用同一個(gè)除數(shù)的重復(fù)除法,執(zhí)行效率會(huì)比較高。在ARM的除法庫(kù)中,存在除數(shù)為10的除法運(yùn)算庫(kù),其中包括有符號(hào)除法和無(wú)符號(hào)除法。如果除數(shù)是10以外的其他常數(shù),用戶可以編寫(xiě)自己的功能函數(shù)。ARM的開(kāi)發(fā)工具集中,提供了關(guān)于除數(shù)是常數(shù)的示例程序和算法分析,以供用戶編寫(xiě)自己的代碼時(shí)參考。
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(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開(kāi)關(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開(kāi)關(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)