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