對于上述算法,其思想是正確的。但在DICE-51單片機(jī)仿真系統(tǒng)具體操作中還存在部分問題。
下面我以DICE系列的DICE-51單片機(jī)仿真系統(tǒng)軟件為例,
給出四除三字節(jié)的算法的程序代碼清單已在DICE-51單片機(jī)仿真系統(tǒng)軟件調(diào)試通過。
首先,因?yàn)镈ICE-51單片機(jī)仿真系統(tǒng)軟件在做除法運(yùn)算時(shí),若產(chǎn)生借位,不能置位,
所以要用CJNE比較指令進(jìn)行置位運(yùn)算。;定義被除數(shù)單元DIVDLL EQU 40HDIVDLH EQU 41HDIVDHL EQU 42HDIVDHH EQU 43H;定義除數(shù)單元DIVDL EQU 44HDIVDM EQU 45HDIVDH EQU 46H;定義余數(shù)單元TEMPL EQU 50HTEMPM EQU 51HTEMPH EQU 52H;定義輔助單元FZ1 EQU 47HFZ2 EQU 48HDIV0: MOV A,DIVDH ;以下四行判斷除數(shù)是否為零ORL A,DIVDMORL A,DIVDLJNZ DIV1 ;如果(A)不等于0,則跳轉(zhuǎn);否則順序執(zhí)行SETB OV ;除數(shù)為零,置溢出標(biāo)志位OV為1,程序結(jié)束SJMP LOOP1DIV1: MOV TEMPL,#00H ;余數(shù)單元清零MOV TEMPM,#00HMOV TEMPH,#00H MOV B,#20H ;置循環(huán)次數(shù)32次DIV2: CLR C ;進(jìn)位位清零MOV A,DIVDLL ;以下三行被除數(shù)最低字節(jié)左移一位(帶進(jìn)位)RLC AMOV DIVDLL,AMOV A,DIVDLH ;以下三行被除數(shù)低16位高字節(jié)左移一位(帶進(jìn)位)RLC AMOV DIVDLH,AMOV A,DIVDHL ;以下三行被除數(shù)高16位低字節(jié)左移一位(帶進(jìn)位)RLC AMOV DIVDHL,AMOV A,DIVDHH ;以下三行被除數(shù)最高字節(jié)左移一位(帶進(jìn)位)RLC AMOV DIVDHH,AMOV A,TEMPL ;以下三行余數(shù)低字節(jié)左移一位(帶進(jìn)位) RLC AMOV TEMPL,AMOV A,TEMPM ;以下三行余數(shù)中間字節(jié)左移一位(帶進(jìn)位)RLC AMOV TEMPM,AMOV A,TEMPH ;以下三行余數(shù)高字節(jié)左移一位(帶進(jìn)位)RLC AMOV TEMPH,AMOV A,TEMPL ;把余數(shù)最低字節(jié)送到累加器A中CLR C SUBB A,DIVDL ;用余數(shù)減去除數(shù)MOV R7,A ;低字節(jié)相減結(jié)果送R7保存MOV A,TEMPLCJNE A,DIVDL,LP ;通過比較運(yùn)算實(shí)現(xiàn)因軟件設(shè)計(jì)原因相減不能借位;而產(chǎn)生的借位LP1: MOV A,DIVDM ADDC A,#00HMOV FZ1,A ;計(jì)算除數(shù)中間字節(jié)與低字節(jié)相減產(chǎn)生的進(jìn)位位之和;將結(jié)果送FZ1保存MOV A,TEMPMCJNE A,FZ1,LP2 ;通過比較運(yùn)算實(shí)現(xiàn)因軟件設(shè)計(jì)原因相減不能借位;而產(chǎn)生的借位LP2: PUSH PSW ;對程序狀態(tài)字PSW壓棧保護(hù)MOV F0,C ;將C的值送給F0保存CLR CMOV A,TEMPMSUBB A,FZ1 MOV R6,A ;中間字節(jié)帶進(jìn)位相減結(jié)果送R6保存MOV C,F0POP PSW ;程序狀態(tài)字PSW彈棧,恢復(fù)現(xiàn)場MOV A,DIVDHADDC A,#00HMOV FZ2,A ;計(jì)算除數(shù)高字節(jié)與中間字節(jié)相減產(chǎn)生的進(jìn)位位之和;將結(jié)果送FZ2保存MOV A,TEMPHCJNE A,FZ2,LP3 ;通過比較運(yùn)算實(shí)現(xiàn)因軟件設(shè)計(jì)原因相減不能借位;而產(chǎn)生的借位LP3: PUSH PSW ;對程序狀態(tài)字PSW壓棧保護(hù)MOV F0,CCLR CMOV A,TEMPHSUBB A,FZ2 ;高字節(jié)帶進(jìn)位相減結(jié)果送R5保存MOV R5,AMOV C,F0POP PSW ;程序狀態(tài)字PSW彈棧,恢復(fù)現(xiàn)場JC DIV3 ;不夠減,則跳轉(zhuǎn)到DIV3DIV4: MOV TEMPL,R7 ;夠減,刷新余數(shù)單元 MOV TEMPM,R6MOV TEMPH,R5MOV R0,#DIVDLL ;夠減,將被除數(shù)最低位置1MOV A,@R0INC AXCH A,@R0DIV3: DJNZ B,DIV2 ;判斷B是否為零,若為零,循環(huán)結(jié)束;否則,跳轉(zhuǎn)繼續(xù)循環(huán)CLR F0LOOP1:NOPRET
評論