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