1 ;//////////////////////////////////////////////////////////////////////////////
2 ;函数: div_u24_u8
3 ;描述: 无符号双字节除以单字节
4 ;入口: (R5,R6,R7)/(R0)
5 ;出口: (R5,R6,R7).(R4)
6 ;注意: 余数在r5;OV=1时表示溢出
7 ;影响: A,B,R0,R4,R5,R6,R7
8 div_u24_u8: mov r4,#0
9 mov b,#24
10 #ifdef __SPEED_P__
11 mov a,r5 ;高字节小于除数的时候,只要移位16次
12 jz _du248_line_03
13 clr c
14 subb a,r0
15 jnc _du248_loop_00
16 mov b,#16
17 clr a
18 xch a,r7
19 xch a,r6
20 xch a,r5
21 xch a,r4
22 sjmp _du248_loop_00
23
24 _du248_line_03: mov a,r6
25 jz _du248_line_04
26 clr c
27 subb a,r0
28 jnc _du248_loop_00
29 mov b,#8 ;高字节=0,中字节小于除数的时候,只要移位8次
30 clr a
31 xch a,r7
32 xch a,r5
33 xch a,r6
34 xch a,r4
35 sjmp _du248_loop_00
36
37 _du248_line_04: mov a,r7 ;高字节=0,中字节=0
38 mov b,r0
39 div ab
40 mov r4,b
41 mov r7,a
42 sjmp _du248_line_05
43 #endif
44 _du248_loop_00: clr c
45
46 mov a,r7 ;向左移位
47 rlc a
48 mov r7,a
49
50 mov a,r6
51 rlc a
52 mov r6,a
53
54 mov a,r5
55 rlc a
56 mov r5,a
57
58 mov a,r4
59 rlc a
60 mov r4,a
61
62 mov F0,c ;移出位=1,或者高字节够减的时候,商+1
63 clr c
64 subb a,r0
65 anl c,/F0
66 jc _du248_line_01
67 mov r4,a
68 inc r7
69 _du248_line_01: djnz b,_du248_loop_00
70
71 _du248_line_05: mov a,r4 ;四舍五入
72 add a,r4
73 jc _du248_line_02
74 subb a,r0
75 jc return_du248
76 _du248_line_02: clr c
77 mov a,#1
78 add a,r7
79 mov r7,a
80 clr a
81 addc a,r6
82 mov r6,a
83 clr a
84 addc a,r5
85 mov r5,a
86
87 return_du248: mov OV,C
88 ret