新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 一种实用的单片机多字节除法程序

一种实用的单片机多字节除法程序

作者: 时间:2012-08-04 来源:网络 收藏
对于上述算法,其思想是正确的。
但在DICE-51仿真系统具体操作中还存在部分问题。
下面我以DICE系列的DICE-51仿真系统软件为例,
给出四除三字节的算法的程序代码清单已在DICE-51仿真系统软件调试通过。
首先,因为DICE-51单片机仿真系统软件在做除法运算时,若产生借位,不能置位,
所以要用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,则跳转;否则顺序执行SETB  OV                       ;除数为零,置溢出标志位OV为1,程序结束SJMP  LOOP1DIV1: MOV   TEMPL,#00H         ;余数单元清零MOV   TEMPM,#00HMOV   TEMPH,#00H MOV   B,#20H                   ;置循环次数32次DIV2: CLR   C                              ;进位位清零MOV   A,DIVDLL       ;以下三行被除数最低字节左移一位(带进位)RLC   AMOV   DIVDLL,AMOV   A,DIVDLH      ;以下三行被除数低16位高字节左移一位(带进位)RLC   AMOV   DIVDLH,AMOV   A,DIVDHL      ;以下三行被除数高16位低字节左移一位(带进位)RLC   AMOV   DIVDHL,AMOV   A,DIVDHH       ;以下三行被除数最高字节左移一位(带进位)RLC   AMOV   DIVDHH,AMOV   A,TEMPL       ;以下三行余数低字节左移一位(带进位)                    RLC   AMOV   TEMPL,AMOV   A,TEMPM       ;以下三行余数中间字节左移一位(带进位)RLC   AMOV   TEMPM,AMOV   A,TEMPH       ;以下三行余数高字节左移一位(带进位)RLC   AMOV   TEMPH,AMOV   A,TEMPL       ;把余数最低字节送到累加器A中CLR   C                               SUBB  A,DIVDL        ;用余数减去除数MOV   R7,A            ;低字节相减结果送R7保存MOV   A,TEMPLCJNE  A,DIVDL,LP     ;通过比较运算实现因软件设计原因相减不能借位;而产生的借位LP1:   MOV   A,DIVDM                         ADDC  A,#00HMOV   FZ1,A         ;计算除数中间字节与低字节相减产生的进位位之和;将结果送FZ1保存MOV   A,TEMPMCJNE  A,FZ1,LP2      ;通过比较运算实现因软件设计原因相减不能借位;而产生的借位LP2:      PUSH  PSW            ;对程序状态字PSW压栈保护MOV   F0,C              ;将C的值送给F0保存CLR   CMOV   A,TEMPMSUBB  A,FZ1   MOV   R6,A            ;中间字节带进位相减结果送R6保存MOV   C,F0POP   PSW             ;程序状态字PSW弹栈,恢复现场MOV   A,DIVDHADDC  A,#00HMOV   FZ2,A       ;计算除数高字节与中间字节相减产生的进位位之和;将结果送FZ2保存MOV   A,TEMPHCJNE  A,FZ2,LP3     ;通过比较运算实现因软件设计原因相减不能借位;而产生的借位LP3:      PUSH  PSW                     ;对程序状态字PSW压栈保护MOV   F0,CCLR   CMOV   A,TEMPHSUBB  A,FZ2                       ;高字节带进位相减结果送R5保存MOV   R5,AMOV   C,F0POP   PSW                          ;程序状态字PSW弹栈,恢复现场JC    DIV3                  ;不够减,则跳转到DIV3DIV4:    MOV   TEMPL,R7             ;够减,刷新余数单元                       MOV   TEMPM,R6MOV   TEMPH,R5MOV   R0,#DIVDLL               ;够减,将被除数最低位置1MOV   A,@R0INC   AXCH   A,@R0DIV3:  DJNZ  B,DIV2      ;判断B是否为零,若为零,循环结束;否则,跳转继续循环CLR   F0LOOP1:NOPRET

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭