加载中…
个人资料
符号
符号
  • 博客等级:
  • 博客积分:0
  • 博客访问:43,490
  • 关注人气:8
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

51单片机多字节除法

(2015-08-18 07:57:36)
标签:

汇编除法

51单片机多字节除法

多字节除法

分类: 积跬步

       由于工作需要,最近写了个51单片机的汇编语言程序,其中的多字节乘除法着实让我废了些事。

       在网上搜了一些资料,汇编实现多字节除法有两种原理,即移位相减和循环相减。

       循环相减的原理就是用被除数减去除数,判断是不是够减,如果够减,将被除数数更新为差值,商加1;如果不够减,则结束,此时的被除数即为余数。其实质就是,求出被除数中有多少个除数。

 

    循环相减的原理虽然简单易懂,但是,在商很大的情况下需要循环相减的次数太多,太占用时间。所以程序中使用移位相减的方法。

       举个例子说明移位相减的做法,1011011除以1110顺序如下:

              1-1110不够减,   结果添0,   1左移一位再加上原来1后的0,10
              10-1110
不够减,     结果添0,   10左移一位再加上原来10后的1,101
              101-1110
不够减,   结果添0, 101左移一位再加上原来101后的1,1011
              1011-1110
不够减, 结果添0, 1011左移一位再加上原来1011后的0,10110
              10110-1110=1000
结果添1,同上左移加上原来10110后的110001
              10001-1110=11
   结果添1,同上左移加上原来101101后的1111
              111-1101  
不够减,结果添0,此时1011011所有位都已移完,运算完毕
1011011= 1110 *0000110+111 ,也即91=14*6+7

       我的程序中被除数是7字节,除数是3字节,这样得到的商最大为4字节,余数最大为3字节。该算法把被除数单元用来存放商数。运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位56次。每移位一次,余数单元都和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。判断是 否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为三个字节,存放在余数单元中。

       具体程序如下:

 

// 被除数由高到低存放在37H38H39H3AH3BH3CH3DH中,除数是固定值,

//其值为360000,程序中DIVLDIVMDIVH即为这个数值的低中高字节的宏定义。

//余数单元的三个字节被定义为YUSHULYUSHUMYUSHUH

//最后算出的商由高到低存放在字节3AH3BH3CH3DH

 

                     MOV             YUSHUL,#00H

                     MOV             YUSHUM,#00H

                     MOV             YUSHUH,#00H

 

                     MOV             B,#38H         ;循环次数,56

DIVD11:        CLR               C

                     MOV             A,3DH

                     RLC               A

                     MOV             3DH,A

 

                     MOV             A,3CH

                     RLC               A

                     MOV             3CH,A

 

                     MOV             A,3BH

                     RLC               A

                     MOV             3BH,A

 

                     MOV             A,3AH

                     RLC               A

                     MOV             3AH,A

 

                     MOV             A,39H

                     RLC               A

                     MOV             39H,A

 

                     MOV             A,38H

                     RLC               A

                     MOV             38H,A

 

                     MOV             A,37H

                     RLC               A

                     MOV             37H,A

 

                     MOV             A,YUSHUL

                     RLC               A

                     MOV             YUSHUL,A

 

                     MOV             A,YUSHUM

                     RLC               A

                     MOV             YUSHUM,A

 

                     MOV             A,YUSHUH

                     RLC               A

                     MOV             YUSHUH,A

 

                     MOV             f0,C ;保存进位位,本程序中,除数为3600003个字节没有占                                                                                  ;满,所以余数不可能有溢出,为保证除法完整性,按照普适

                             ;情况考虑

                     CLR               C

                     MOV             A,YUSHUL

                     SUBB            A,DIVL

                     MOV             R7,A

 

                     MOV             A,YUSHUM

                     SUBB            A,DIVM

                     MOV             R6,A

 

                     MOV             A,YUSHUH

                     SUBB            A,DIVH

                     MOV             R5,A

 

                     JB                  f0,DIVDD      ;F0=1时,肯定够减

                     JC                  DIVD22         ;F0=0时,C=1,不够减,跳到DIVD22

DIVDD:         MOV             YUSHUL,R7

                     MOV             YUSHUM,R6

                     MOV             YUSHUH,R5

                     INC               3DH

DIVD22:        DJNZ             B,DIVD11

                     CLR               C

OVER:           RET

 

参考文章:http://www.51hei.com/mcu/1451.html

              http://blog.163.com/fenglanghai@126/blog/static/335687792010111025841816/

              http://blog.sina.com.cn/s/blog_4522f0b80100luz7.html

 

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有