新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 一種實(shí)用的單片機(jī)多字節(jié)除法程序

一種實(shí)用的單片機(jī)多字節(jié)除法程序

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

的實(shí)際應(yīng)用中,除法運(yùn)算是以比較常見的運(yùn)算。

以MCS-51為例,雖然提供了,但只能進(jìn)行單字節(jié)的運(yùn)算。如果要進(jìn)行多字節(jié)的除法運(yùn)算,就得自己設(shè)計算法。目前,許多資料上都介紹了四字節(jié)除以二字節(jié)的算法,但它們主要有以下幾點(diǎn)不足:
1. 只能求出商,不能求出余數(shù);
2. 在被除數(shù)高二字節(jié)大于除數(shù)時,不能進(jìn)行運(yùn)算;
3. 商只有兩個字節(jié)。 例如,被除數(shù)是0FFFFFFFFH,除數(shù)是0004H時,商數(shù)應(yīng)該是3FFFFFFFH,余數(shù)是0003H。
但是,用以前的算法是無法進(jìn)行運(yùn)算的。 在實(shí)際運(yùn)用中,參與運(yùn)算的數(shù)是任意的,有時需要求出余數(shù),有時商數(shù)要求有四個字節(jié),因此,以前的算法在實(shí)際應(yīng)用中受到了很大的限制。 為了滿足實(shí)際運(yùn)用中的需要,有一套新的四字節(jié)除以二字節(jié)的算法,克服了上述算法中的缺點(diǎn),可以適合廣泛的實(shí)際需要。下面以MCS-51匯編語言為例進(jìn)行說明。 該算法增加了兩字節(jié)的余數(shù)單元,并把被除數(shù)單元用來存放商數(shù)。運(yùn)算時,首先判斷除數(shù)是否為零,若為零時,則設(shè)溢出標(biāo)志為1,然后退出。若除數(shù)不為零,則采用移位相減法進(jìn)行運(yùn)算。
首先,把進(jìn)位位和余數(shù)單元清零。再將進(jìn)位位、余數(shù)單元和被除數(shù)單元按順序首尾相連,逐位進(jìn)行向左循環(huán)移位,共移位32次。每移位一次,余數(shù)單元都和除數(shù)作一次減法運(yùn)算,若夠減,余數(shù)單元內(nèi)容更新為兩者之差,并且將被除數(shù)最末一位置為1;若不夠減,則余數(shù)單元內(nèi)容保持不變,且將被除數(shù)最末一位置為0。判斷是否夠減的方法是:在作減法之前,先保存進(jìn)位位,再看作完減法后的進(jìn)位位。僅在作減法之前進(jìn)位位為0,并且作減法之后進(jìn)位位為1時判為不夠減,其余情況均視為夠減。這樣,等到全部運(yùn)算結(jié)束時,商數(shù)為四個字節(jié),存放在被除數(shù)單元中;余數(shù)為兩個字節(jié),存放在余數(shù)單元中。
例如,被除數(shù)是0FFFFFFFFH,除數(shù)是0004H時,運(yùn)行新的算法,商數(shù)是3FFFFFFFH,存放在被除數(shù)單元中,余數(shù)是0003H,存放在余數(shù)單元中。 這個算法自然、流暢,運(yùn)算結(jié)果商數(shù)為四個字節(jié),余數(shù)為兩個字節(jié),尤其是在求除以某數(shù)的N次方時,只需連續(xù)調(diào)用N次該算法子程序就可以了,省去了繁瑣的數(shù)據(jù)轉(zhuǎn)存語句。該算法還可以依實(shí)際需要擴(kuò)充為位數(shù)更高的多字節(jié)除數(shù)算法,也可以移植到其它的平臺上。

本算法已在AT89C51單片機(jī)上調(diào)試通過。下面給出算法的程序代碼清單。

divdll data  20h ;定義被除數(shù)單元divdlh data 21hdivdhl data 22hdlvdhh data 23hdivl data 24h ;定義除數(shù)單元divh data 25htempl data 26h ;定義余數(shù)單元temph data 27hdivd: push accpush bmov a,divdh ;判除數(shù)是否為零orl a,divljnz divd0setb ov ;除數(shù)為零,置溢出標(biāo)志pop bpop accretdivd0: mov templ,#00h ;除數(shù)不為零,進(jìn)行運(yùn)算mov temph,#00hmov b,#20h ;置循環(huán)次數(shù)divd1:clr c ;進(jìn)位位、余數(shù)單元和mov a,divdll ;被除數(shù)單元全體逐個rlc a ;向左循環(huán)移位mov divdll,amov a,divdlhrlc amov divdlh,amov a,divdhlrlc amov divdhl,amov a,divdhhrlc amov divdhh,amov a,templrlc amov templ,axch a,temphrlc axch a,temphmov f0,c ;保存進(jìn)位位clr csubb a,divl ;用余數(shù)減去除數(shù)mov r7,amov a,temphsubb a,divh jc    divd2 mov templ,r7 ;夠減,刷新余數(shù)單元mov temph,ainc divdll ;商上1divd2: djnz b,divd1clr ovpop bpop accretend
				
            
                
			
							
上一頁 1 2 下一頁

評論


相關(guān)推薦

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

關(guān)閉