无符号双字节除以单字节(51单片机,汇编源码)
扫描二维码
随时随地手机看文章
采用移位减法的算法。源码如下:
1 ;//////////////////////////////////////////////////////////////////////////////
2 ;函数: div_u16_u8
3 ;描述: 无符号双字节除以单字节
4 ;入口: (R6,R7)/(R0)
5 ;出口: (R6,R7).(R5)
6 ;注意: 余数在R5;OV=1时表示溢出
7 ;影响: A,B,R0,R5,R6,R7
8 div_u16_u8: mov r5,#0
9 mov b,#16
10 #ifdef __SPEED_P__
11 mov a,r6 ;高字节小于除数的时候,只要移位8次
12 jz _du168_line_03
13 clr c
14 subb a,r0
15 jnc _du168_loop_00
16
17 mov b,#8
18 clr a
19 xch a,r7
20 xch a,r6
21 xch a,r5
22 sjmp _du168_loop_00
23
24 _du168_line_03: mov a,r7
25 mov b,r0
26 div ab
27 mov r7,a
28 mov r5,b
29 sjmp _du168_line_04
30 #endif
31 _du168_loop_00: clr c
32
33 mov a,r7 ;向左移位
34 rlc a
35 mov r7,a
36
37 mov a,r6
38 rlc a
39 mov r6,a
40
41 mov a,r5
42 rlc a
43 mov r5,a
44
45 mov F0,c ;移出位=1,或者高字节够减的时候,商+1
46 clr c
47 subb a,r0
48 anl c,/F0
49 jc _du168_line_01
50 mov r5,a
51 inc r7
52 _du168_line_01: djnz b,_du168_loop_00
53
54 _du168_line_04: mov a,r5 ;四舍五入
55 add a,r5
56 jc _du168_line_02
57 subb a,r0
58 jc return_du168
59 _du168_line_02: clr c
60 mov a,#1
61 add a,r7
62 mov r7,a
63 clr a
64 addc a,r6
65 mov r6,a
66
67 return_du168: mov OV,C
68 ret