- 壹零零单片机©版权所有 2008-2023 粤ICP备17151077号
***************************************************************************
;名称:32位除以16位
;被除数: xtmp1 xtmp2 xtmp3 xtmp4(H--L)
;除数 : xtmp5 xtmp6(H--L) (不能为零)
;商 : xtmp1 xtmp2 xtmp3 xtmp4(H--L)
;余数 : xtmp7 xtmp8
;其它 : xtmp9
;运算原理:
;首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。若除数不为零,则采用移位相减法进行运算。
;首先,把进位位和余数单元清零。再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位32次。
;每移位一次,余数单元都和除数作一次减法运算,
;若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;
;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。
;判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。
;仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,
;其余情况均视为够减。这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。
;整除,余数是对,不整除,余数不对
;***************************************************************************
F32DIV16:
;余数清0
clrr xtmp7
clrr xtmp8
;被除数位数,也是循环次数
movia 32
movar xtmp9
clrwdt
DIVloop1:
bclr status,c
;余数带C左移1位,被除数带C左移1位,
rlr xtmp4,1
rlr xtmp3,1
rlr xtmp2,1
rlr xtmp1,1
rlr xtmp8,1
rlr xtmp7,1
jbts0 status,c
goto DIVloop2
;比较余数与除数大小
movr xtmp6,0
subra xtmp8,A
movr xtmp5,0
sbcra xtmp7,A
jbts1 status,c
goto DIVloop3
DIVloop2:
;余数大于除数,余数等于余数减去除数
;bclr status,c
movr xtmp6,0
subra xtmp8,R
movr xtmp5,0
sbcra xtmp7,R
bset xtmp4,0
DIVloop3:
DIVloop4:
djzr xtmp9,R
goto DIVloop1
return