<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AVR單片機定點運算及數(shù)制轉(zhuǎn)換子程序

          AVR單片機定點運算及數(shù)制轉(zhuǎn)換子程序

          作者: 時間:2012-04-05 來源:網(wǎng)絡(luò) 收藏

          問世以來,獲得廣泛關(guān)注。它是一種采用精簡指令集、以時鐘周期為機器周期的高速。它采用快速寄存器文件(共有32個寄存器 R0~R31,其中R16~R31具有較強通用功能)、快速單周期指令。另外在存儲器技術(shù)(Flash存儲器、EEPROM)、低功耗、系統(tǒng)可靠性、定時 /計數(shù)器功能多樣化等方面也都具特色。但由于采用精簡指令集,它沒有一般8位機的DAA指令。因BCD碼加減法數(shù)制都要用到DAA功能,故給使用匯編語言研發(fā)帶來不便。本文重點介紹用軟件實現(xiàn)DAA的方法。

          本文引用地址:http://www.ex-cimer.com/article/171686.htm

          計算機采用的十進制操作數(shù)一般都為壓縮型8421 BCD碼,每個BCD碼表示1位十進制數(shù)。每2位BCD碼共存于同一字節(jié)單元中,故BCD涉及狀態(tài)寄存器SREG的進位C(第0位)和半進位H(第5 位)。它們分別為高、低位BCD的進(借)位。在進行BCD碼加減時,計算機是按二進制數(shù)對待的,因此會產(chǎn)生與十進制運算規(guī)則不相符合的情況:一是當(dāng)產(chǎn)生進(借)位(C=1或H=1)時,該進(借)位等于16(對所涉及的1位BCD碼而言),而在十進制運算中應(yīng)等于10;二是可能產(chǎn)生非法BCD碼(值大于9)。軟件DAA即為糾正以上錯誤而設(shè)的。

          1 軟件DAA的實現(xiàn)方法

          1.1 實現(xiàn)加法DAA功能ADAA和ADAA1的設(shè)計方法

          經(jīng)實踐考查,BCD碼加法運算,可產(chǎn)生以下3種情況:

          ① 不須調(diào)整,特點是既不產(chǎn)生進位,也不產(chǎn)生非法BCD碼。如$22+$11=$33。

          ② 產(chǎn)生非法BCD碼,必須加6調(diào)整。特點是BCD碼相加后不產(chǎn)生進位,但加6調(diào)整后產(chǎn)生進位。如
          $36+$37=$6D(產(chǎn)生非法BCD),加6調(diào)整后變?yōu)?73(產(chǎn)生半進位H)。$68+$87=$EF,加$66調(diào)整后變?yōu)?155(產(chǎn)生進位C和半進位H)等。

          ③ 產(chǎn)生進位,必須加6調(diào)整。特點是BCD碼相加只產(chǎn)生進位,不會同時產(chǎn)生非法BCD碼;而加6調(diào)整后既不會再產(chǎn)生進位/半進位(而是清除了原來的進位/半進位),也不會產(chǎn)生非法BCD碼。例:
          $99+$88=$121,進位C和半進H位都置位,故加$66來調(diào)整:$21+$66=$87,并要恢復(fù)進位C。

          綜合以上3種情況,得出下面加法DAA之實現(xiàn)方法:首先保存BCD碼相加后的狀態(tài)寄存器SREG(保存其中的進位C和半進位H,稱為Co和Ho)。再將 BCD碼之和加上$66,產(chǎn)生出新的進位Cn及半進位Hn。若Co、Cn中有1個置位(只能有1個!),說明高位BCD滿足調(diào)整條件并調(diào)整完畢,否則為不夠調(diào)整條件,應(yīng)減$60恢復(fù);若Ho、Hn中有1個(只能有1個!)置位,說明低位BCD滿足調(diào)整條件并調(diào)整完畢,否則為不夠調(diào)整條件,應(yīng)減6恢復(fù)。程序中是將新、舊進位和半進位對應(yīng)或起來,只對或結(jié)果進行判斷。注意,軟件DAA功能既要保證本字節(jié)壓縮BCD碼相加值的正確性,又要保證對高位 BCD產(chǎn)生進位的正確性,故要將Co∨Cn的結(jié)果返還給SREG,以使下一步能正確實現(xiàn)高位BCD帶進位加。

          ADAA為BCD碼相加調(diào)整,使用寄存器R20作為工作單元(使用R22、R11、R10等3個寄存器作為輔助工作單元),所有調(diào)整工作都在此單元內(nèi)進行。

          ADAA1為數(shù)制程序中實現(xiàn)BCD碼左移調(diào)整的,為加法DAA之特例:它在R20工作單元內(nèi)實施BCD碼帶進位位自加并完成對和的調(diào)整。

          1.2 實現(xiàn)減法DAA功能子程序SDAA的設(shè)計方法

          由實踐可知,減法DAA要比加法來得簡單:只須對產(chǎn)生借位的BCD碼進行調(diào)整。BCD碼減法運算,只有以下2種情況:

          ① 不產(chǎn)生借位,不須調(diào)整,如 $22-$11=$11。

          ② 產(chǎn)生借位,此時不論有否非法BCD碼產(chǎn)生,一律對產(chǎn)生借位的BCD碼加$A調(diào)整。但沒有加字節(jié)型立即數(shù)指令,改為減6調(diào)整,要注意加原和減補對進位的影響是相反的。為保證多字節(jié)壓縮BCD碼運算的正確性,若調(diào)整后清除了借位C,必須將其恢復(fù)。例如$22-$54=$CE,因C、H皆置位,用減去$66來調(diào)整$CE-$66=$68,調(diào)整后清除了借位C,故子程序中還要加SEC 指令來恢復(fù)借位C。

          注:MCS-51單片機減法DAA子程序很容易按此移植(半進位為AC)。

          1.3 實現(xiàn)右移DAA功能子程序RDAA的設(shè)計方法

          見3 數(shù)制子程序中對BCD碼右移調(diào)整的說明。

          2 運算子程序

          (1)多字節(jié)壓縮BCD碼加法子程序ADBCD

          加法在寄存器內(nèi)直接完成,以R20為DAA工作單元。BCD碼相加后,將和送到R20,調(diào)用ADAA子程序,實現(xiàn)對和的調(diào)整(返回主程序后再回送調(diào)整結(jié)果)。

          (2)多字節(jié)壓縮BCD碼減法子程序SUBCD

          減法在寄存器內(nèi)直接完成,以R20為DAA工作單元。BCD碼相減后,將差送至R20,調(diào)用SDAA子程序,實現(xiàn)對差的調(diào)整(返回主程序后再回送調(diào)整結(jié)果)。

          (3)乘法子程序MUL16

          操作:(R13,R12)×(R15,R14)→ R17,R16,R15,R14

          采用字乘字無符號數(shù)運算。采取逐次右移部分積和乘數(shù),當(dāng)乘數(shù)移出位等于1時將被乘數(shù)加入部分積的方法完成計算??梢暈?6位整數(shù)×16位整數(shù)→32位整數(shù),也可視為16位整數(shù)×16位小數(shù)→16位整數(shù),或視為16位小數(shù)×16位小數(shù)→32位小數(shù)??杉由仙崛胩幚?。

          (4)除法子程序DIV16

          操作:(R17,R16,R15,R14)÷(R13,R2)→R15,R14

          采用雙字除以字無符號數(shù)運算。采取逐次左移被除數(shù)與除數(shù)相減、試商、記商的方法完成計算??梢暈殡p字型整數(shù)÷字型整數(shù)→字型整數(shù),也可視為小數(shù)÷小數(shù)→ 小數(shù)。要求 (R17,R16)<(R13,R12)??杉由仙崛胩幚恚⒁饪赡墚a(chǎn)生舍入溢出(例如$7FFFC000÷$8000=$FFFF.8,舍入取整即產(chǎn)生溢出)。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();