📄 doublediv.lst
字号:
8051 Assembler Version 1.00 05/11/105 12:59:09 Page 1
C:\Documents and Settings\xulxl\My Documents\单片机\DoubleDiv.a51
1 0000
2 0000 ;入口参数:(R7 R6) =被除数, (R5 R4) = 除数
3 0000 ;出口: (R7 R6) = 商数,(OVER = 溢出标志位
4 0000 ;工作寄存器: (R3 R2) =部分余数, (R1)= 计数器,(R0) =差值暂存
5 0000
6 0000
7 0000
8 0000 ORG 0000H
9 0000 SIG1 BIT 00H ;定义三个位变量
10 0000 SIG2 BIT 01H
11 0000 SIG BIT 02H
12 0000 ;判断除数和被除数是不是为0,并做相应的处理
13 0000 ED Start: MOV A, R5
14 0001 7003 JNZ checkdividend
15 0003 EC MOV A, R4
16 0004 607B JZ over ;如果为0,则置溢出标志位
17 0006 ;判断被除数
18 0006 EF checkdividend: MOV A, R7
19 0007 7004 JNZ begindiv ;非0则开始执行
20 0009 EE MOV A, R6
21 000A 7001 JNZ begindiv
22 000C 22 RET
23 000D
24 000D ;判断两个数的符号,并且做相应的处理
25 000D EF begindiv: MOV A, R7
26 000E 33 RLC A
27 000F 9200 MOV SIG1, C ;存放被除数符号
28 0011 ED MOV A, R5
29 0012 33 RLC A
30 0013 9201 MOV SIG2, C ;存放除数符号
31 0015 8200 ANL c, SIG1 ;计算积的符号
32 0017 4006 JC posi ;若两数均负积正则转posi
33 0019 A200 MOV c, SIG1 ;两数非全负时积的符号
34 001B 7201 ORL c, SIG2
35 001D 8001 SJMP sign
36 001F B3 posi: CPL C ;取反
37 0020 9202 sign: MOV SIG, C ;商的符号
38 0022 EF MOV A, R7
39 0023 20E706 JB Acc.7, cp1 ;被除数为负转求补
40 0026 ED step1: MOV A, R5
41 0027 20E70E JB Acc.7 cp2 ;除数为负转求补
42 002A 8018 step2: SJMP doublediv ;开始除法
43 002C ;被除数求补
44 002C EE cp1: MOV A, R6
45 002D F4 CPL A
46 002E 2401 ADD A,#01H
47 0030 FE MOV R6, A
48 0031 EF MOV A, R7
49 0032 F4 CPL A
50 0033 2401 ADD A, #01H
51 0035 FF MOV R7, A
52 0036 80EE SJMP step1
53 0038 ;除数求补
54 0038 EC cp2: MOV A, R4
55 0039 F4 CPL A
56 003A 2401 ADD A, #01H
57 003C FC MOV R4, A
8051 Assembler Version 1.00 05/11/105 12:59:09 Page 2
C:\Documents and Settings\xulxl\My Documents\单片机\DoubleDiv.a51
58 003D ED MOV A, R5
59 003E F4 CPL A
60 003F 2401 ADD A, #01H
61 0041 FD MOV R5, A
62 0042 80E6 SJMP step2
63 0044
64 0044 ;双字节除法开始
65 0044 ;入口参数:(R7 R6) =被除数, (R5 R4) = 除数
66 0044 ;出口: (R7 R6) = 商数,(OVER = 溢出标志位
67 0044 ;工作寄存器: (R3 R2) =部分余数, (R1)= 计数器,(R0) =差值暂存
68 0044
69 0044 E4 doublediv: CLR A
70 0045 FA MOV R2, A
71 0046 FB MOV R3, A
72 0047 7910 MOV R1, #10H ;双字节除法计数器置16
73 0049 ;开始(R3,R2,R7,R6)移位操作
74 0049 C3 div1: CLR C
75 004A EE MOV A, R6 ;被除数低8位左移
76 004B 33 RLC A
77 004C FE MOV R6, A
78 004D EF MOV A, R7 ;被除数高8位循环左移
79 004E 33 RLC A
80 004F FF MOV R7, A
81 0050 EA MOV A, R2 ;余数低8位循环左移
82 0051 33 RLC A
83 0052 FA MOV R2, A
84 0053 EB MOV A, R3 ;余数高8位循环左移
85 0054 33 RLC A
86 0055 FB MOV R3, A
87 0056 ;开始部分余数减除数
88 0056 EA div2: MOV A, R2 ;低8位先减
89 0057 9C SUBB A, R4
90 0058 F8 MOV R0, A ;暂存差值
91 0059 EB MOV A, R3
92 005A 9D SUBB A, R5 ;高8位相减
93 005B 4004 JC next ;若部分余数<除数转next
94 005D 0E INC R6 ;若部分余数>=除数则商1
95 005E FB MOV R3, A ;新余数存R3R2
96 005F E8 MOV A, R0
97 0060 FA MOV R2, A
98 0061 D9E6 next: DJNZ R1, div1 ;16位未除完则循环
99 0063 EB MOV A, R3 ;16位除完则开始看余数
100 0064 20E70F JB Acc.7, add1 ;若余数最高位为1则进1
101 0067 C3 CLR C ;开始余数除2
102 0068 EA MOV A, R2
103 0069 33 RLC A ;余数低8位乘2
104 006A FA MOV R2, A
105 006B EB MOV A, R3
106 006C 33 RLC A ;余数高8位乘2
107 006D 9D SUBB A, R5 ;余数*2-除数
108 006E 400E JC noover ;若余数*2<除数则结束
109 0070 7004 JNZ add1 ;若够减则转进1
110 0072 EA MOV A, R2 ;高8位相等时比较低8位
111 0073 9C SUBB A, R4
112 0074 4008 JC noover ;余数*2<除数则转结束
113 0076 ;商进1处理
114 0076 EE add1: MOV A, R6
8051 Assembler Version 1.00 05/11/105 12:59:09 Page 3
C:\Documents and Settings\xulxl\My Documents\单片机\DoubleDiv.a51
115 0077 2401 ADD A, #01H
116 0079 FE MOV R6, A
117 007A EF MOV A, R7
118 007B 3400 ADDC A, #00H
119 007D FF MOV R7, A
120 007E
121 007E 758100 noover: MOV OVER, #00H ;清溢出标志
122 0081
123 0081
124 0081 7581FF over: MOV OVER, #0FFH ;置溢出标志
125 0084 200201 JB SIG, cp3 ;如果商的结果为负则求补
126 0087
127 0087 22 enddiv: RET
128 0088 ;商为负时求补
129 0088 EE cp3: MOV A, R6
130 0089 F4 CPL A
131 008A 2401 ADD A, #01H
132 008C FE MOV R6, A
133 008D EF MOV A, R7
134 008E F4 CPL A
135 008F 2401 ADD A, #01H
136 0091 FF MOV R7, A
137 0092 80F3 SJMP enddiv
138 0094 END
Defined Symbols:
SIG 000002 2
SIG1 000000 0
SIG2 000001 1
Defined Labels:
ADD1 000076 118
BEGINDIV 00000D 13
CHECKDIVIDEND 000006 6
CP1 00002C 44
CP2 000038 56
CP3 000088 136
DIV1 000049 73
DIV2 000056 86
DOUBLEDIV 000044 68
ENDDIV 000087 135
NEXT 000061 97
NOOVER 00007E 126
OVER 000081 129
POSI 00001F 31
SIGN 000020 32
START 000000 0
STEP1 000026 38
STEP2 00002A 42
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -