<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/171686.htm

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

1 軟件DAA的實(shí)現方法

1.1 實(shí)現加法DAA功能ADAA和ADAA1的設計方法

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

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

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

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

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

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

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

1.2 實(shí)現減法DAA功能子程序SDAA的設計方法

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

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

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

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

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

見(jiàn)3 數制子程序中對BCD碼右移調整的說(shuō)明。

2 運算子程序

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

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

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

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

(3)乘法子程序MUL16

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

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

(4)除法子程序DIV16

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

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


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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>