汇编算法之除法

 
汇编算法之除法
2010-05-12 21:22

除法说得简单一点就是循环做减法,等减到不能再减了,那商也就出来了,余数也就得到了。

在单片机系统中,有时候也要用到除法的,但如果没有除法指令怎么办呢?

而且单片机系统中除法和现实纯数学中的又不一样,它需要节约硬件资源又要运算速度快。

下面就介绍一种即省时又节约资源的单字节除法算法,并附上51的汇编程序:

 

算法思想

00001001/00000011=00000011

被除数是00001001(9)

除数是00000011(3)

商是00000011(3)

余数是00000000(0)

算法思想是:

1、将被除数高位移入Temp中(高位开始按顺序移入Temp中)

2、将Temp减去除数

3、如果小于0,则置商值低位为0

     如果大于等于0,则置商值低位为1,并将相减的结果放入Temp中

4、将商值左移1位

5、判断是否循环完成(一共循环8次)

6、没有则跳到步骤1继续执行

7、完成则存入商值和余数(Temp)

 

按照上面的例子执行的结果如下:

1、00000000-00000011小于0,商值为00000000

2、00000000-00000011小于0,商值为00000000

3、00000000-00000011小于0,商值为00000000

4、00000000-00000011小于0,商值为00000000

5、00000001-00000011小于0,商值为00000000

6、00000010-00000011小于0,商值为00000000

7、00000100-00000011大于0,商值为00000001,余数为00000001赋值给Temp

8、00000011-00000011等于0,商值为00000011,余数为00000000

至此算法完成

注:单字节是循环8次,如果是双字节就要循环16次,依次类推

 

 附:

如果是00001011/00000011

...

7.  101-11  商1      余10

8.  101(10为上一次的余数10,1为输入的1)-11  商11(商值左移1位)    余10

...

附51单片机汇编程序

lt1     db        ;除数
lt2     db        ;被除数
tmp1    db        ;商
tmp2    db        ;中间变量
tmp3    db        ;作为被除数的中间变量
tmp     db        ;循环的次数
code   .section    at 0   'code'
org    00h
jmp    start
org    04h
ret
org    20h
start:
mov    a,05h
mov    lt2,a        ;赋值给被除数
mov    a,00h
mov    lt1,a        ;赋值给除数
sz     acc
jmp    go_on
jmp    end_         ;如果除数为0,程序结束   
;----------------
go_on:
      mov   a,lt2
divui_0:           ;开始除法运算
      mov   tmp3,a   ;被除数赋给tmp3
      mov   a,8
      mov   tmp,a    ;循环的次数
      clr   tmp1
      clr   tmp2
divui_1:
      clr          ;清除借位标志
      rlc   tmp3      ;被除数左移一位
      rlc   tmp2      ;把被除数从高位左移至tmp2
      mov   a,lt1     ;除数赋给acc
      sub   a,tmp2    ;tmp2与除数比较大小
      sz           ;两数相等则z为1
      jmp   divui_2   ;等于,跳到divui_2
      sz           ;不等于,判断是否有借位
      jmp   divui_3   ;没有借位,除数大于被除数
divui_2:            ;有借位,被除数大于除数
      mov   a,tmp2   
      sub   a,lt1     ;被除数减去除数
      mov   tmp2,a    ;得到余数
      set          ;商1
      jmp   divui_4  
divui_3:
      clr          ;商0
divui_4:
      rlc   tmp1      ;把商移进tmp1
      sdz   tmp       ;循环是否有8次?
      jmp   divui_1   ;没有,继续循环
      mov   a,tmp1    ;把商存在acc
;----------------------------
end_:
      jmp          ;原地踏步
end                 ;程序结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值