首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

汇编算法之除法

汇编算法之除法

汇编算法之除法
除法说得简单一点就是循环做减法,等减到不能再减了,那商也就出来了,余数也就得到了。
在单片机系统中,有时候也要用到除法的,但如果没有除法指令怎么办呢?
而且单片机系统中除法和现实纯数学中的又不一样,它需要节约硬件资源又要运算速度快。
下面就介绍一种即省时又节约资源的单字节除法算法,并附上51的汇编程序:

算法思想
00001001/00000011=00000011
被除数是00001001(9)
除数是00000011(3)
商是00000011(3)
余数是00000000(0)
算法思想是:
  1、将被除数高位移入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次,依次类推

附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  c        ;清除借位标志
     rlc  tmp3     ;被除数左移一位
     rlc  tmp2     ;把被除数从高位左移至tmp2
     mov  a,lt1    ;除数赋给acc
     sub  a,tmp2   ;tmp2与除数比较大小
     sz   z        ;两数相等则z为1
     jmp  divui_2  ;等于,跳到divui_2
     sz   c        ;不等于,判断是否有借位
     jmp  divui_3  ;没有借位,除数大于被除数
divui_2:           ;有借位,被除数大于除数
     mov  a,tmp2   
     sub  a,lt1    ;被除数减去除数
     mov  tmp2,a   ;得到余数
     set  c        ;商1
     jmp  divui_4  
divui_3:
     clr  c        ;商0
divui_4:
     rlc  tmp1     ;把商移进tmp1
     sdz  tmp      ;循环是否有8次?
     jmp  divui_1  ;没有,继续循环
     mov  a,tmp1   ;把商存在acc
;----------------------------
end_:
     jmp  $        ;原地踏步
end                ;程序结束
返回列表