📄 51.lst
字号:
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 1
MACRO ASSEMBLER A51 V7.09
OBJECT MODULE PLACED IN 51.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE 51.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;**********************************************************
2 ; MCS-51定点运算子程序库及其使用说明
3
4 ; 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数
5 ;据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,
6 ;(31H)=34H,(32H)=56H。
7 ; 2.运算精度:单次定点运算精度为结果最低位的当量值。
8 ; 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无
9 ;关的或非消耗性的信息,程序就具有较好的透明性。
10 ;********************************************************************
11 ;(1) 标号:BCDA 功能:多字节BCD码加法
12 ;(2) 标号:BCDB 功能:多字节BCD码减法
13 ;(3) 标号:NEG 功能:多字节BCD码取补
14 ;(4) 标号:BRLN 功能:多字节BCD码左移十进制一位(乘十)
15 ;(5) 标号:MULD 功能:双字节二进制无符号数乘法
16 ;(6) 标号: MUL2 功能:双字节二进制无符号数平方
17 ;(7) 标号:DIVD 功能:双字节二进制无符号数除法
18 ;(8) 标号:D457 功能:双字节二进制无符号数除以单字节二进制数
19 ;(9) 标号: DV31 功能:三字节二进制无符号数除以单字节二进制数
20 ;(10)标号:MULS 功能:双字节二进制有符号数乘法(补码)
21 ;(11)标号:DIVS 功能:双字节二进制有符号数除法(补码)
22 ;(12)标号:SH2 功能:双字节二进制无符号数开平方(快速)
23 ;(13)标号: SH4 功能:四字节二进制无符号数开平方(快速)
24 ;(14)标号:HASC 功能:单字节十六进制数转换成双字节ASCII码
25 ;(15)标号:ASCH 功能:ASCII码转换成十六进制数
26 ;(16)标号: HBCD 功能:单字节十六进制整数转换成单字节BCD码整数
27 ;(17)标号:HB2 功能:双字节十六进制整数转换成双字节BCD码整数
28 ;(18)标号:HBD 功能:单字节十六进制小数转换成单字节BCD码小数
29 ;(19)标号:HBD2 功能:双字节十六进制小数转换成双字节BCD码小数
30 ;(20)标号:BCDH 功能:单字节BCD码整数转换成单字节十六进制整数
31 ;(21)标号:BH2 功能:双字节BCD码整数转换成双字节十六进制整数
32 ;(22)标号:BHD 功能:单字节BCD码小数转换成单字节十六进制小数
33 ;(23)标号:BHD2 功能:双字节BCD码小数转换成双字节十六进制小数
34 ;(24)标号:MM 功能:求单字节十六进制无符号数据块的极值
35 ;(25)标号:MMS 功能:求单字节十六进制有符号数据块的极值
36 ;(26)标号:FDS1 功能:顺序查找(ROM)单字节表格
37 ;(27)标号:FDS2 功能:顺序查找(ROM)双字节表格
38 ;(28)标号:FDD1 功能:对分查找(ROM)单字节无符号增序数据表格
39 ;(29)标号:FDD2 功能:对分查找(ROM)双字节无符号增序数据表格
40 ;(30)标号: DDM1 功能:求单字节十六进制无符号数据块的平均值
41 ;(31)标号:DDM2 功能:求双字节十六进制无符号数据块的平均值
42 ;(32)标号:XR1 功能:求单字节数据块的(异或)校验和
43 ;(33) 标号:XR2 功能:求双字节数据块的(异或)校验和
44 ;(34)标号:SORT 功能:单字节无符号数据块排序(增序)
45
46 ;**********************************************************
47 ; (1) 标号: BCDA 功能:多字节BCD码加法
48
49 ;入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
50 ;出口信息:和在[R0]中,最高位进位在CY中。
51 ;影响资源:PSW、A、R2 堆栈需求: 2字节
52
0000 53 BCDA:
0000 EF 54 MOV A,R7 ;取字节数至R2中
0001 FA 55 MOV R2,A
0002 28 56 ADD A,R0 ;初始化数据指针
0003 F8 57 MOV R0,A
0004 EA 58 MOV A,R2
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 2
0005 29 59 ADD A,R1
0006 F9 60 MOV R1,A
0007 C3 61 CLR C
0008 62 BCD1:
0008 18 63 DEC R0 ;调整数据指针
0009 19 64 DEC R1
000A E6 65 MOV A,@R0
000B 37 66 ADDC A,@R1 ;按字节相加
000C D4 67 DA A ;十进制调整
000D F6 68 MOV @R0,A ;和存回[R0]中
000E DAF8 69 DJNZ R2,BCD1 ;处理完所有字节
0010 22 70 RET
71
72 ; (2) 标号:BCDB 功能:多字节BCD码减法
73
74 ;入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
75 ;出口信息:差在[R0]中,最高位借位在CY中。
76 ;影响资源:PSW、A、R2、R3 堆栈需求: 6字节
77
0011 78 BCDB:
0011 120020 79 LCALL NEG1 ;减数[R1]十进制取补
0014 120000 80 LCALL BCDA ;按多字节BCD码加法处理
0017 B3 81 CPL C ;将补码加法的进位标志转换成借位标志
0018 92D5 82 MOV F0,C ;保护借位标志
001A 120020 83 LCALL NEG1 ;恢复减数[R1]的原始值
001D A2D5 84 MOV C,F0 ;恢复借位标志
001F 22 85 RET
0020 86 NEG1:
0020 E8 87 MOV A,R0 ;[R1]十进制取补子程序入口
0021 C9 88 XCH A,R1 ;交换指针
0022 C8 89 XCH A,R0
0023 12002A 90 LCALL NEG ;通过[R0]实现[R1]取补
91
0026 E8 92 MOV A,R0
0027 C9 93 XCH A,R1 ;换回指针
0028 C8 94 XCH A,R0
0029 22 95 RET
96
97 ; (3)标号:NEG 功能:多字节BCD码取补
98
99 ;入口条件:字节数在R7中,操作数在[R0]中。
100 ;出口信息:结果仍在[R0]中。
101 ;影响资源:PSW、A、R2、R3 堆栈需求: 2字节
102
002A 103 NEG:
002A EF 104 MOV A,R7 ;取(字节数减一)至R2中
002B 14 105 DEC A
002C FA 106 MOV R2,A
002D E8 107 MOV A,R0 ;保护指针
002E FB 108 MOV R3,A
002F 109 NEG0:
002F C3 110 CLR C
0030 7499 111 MOV A,#99H
0032 96 112 SUBB A,@R0 ;按字节十进制取补
0033 F6 113 MOV @R0,A ;存回[R0]中
0034 08 114 INC R0 ;调整数据指针
0035 DAF8 115 DJNZ R2,NEG0 ;处理完(R2)字节
116
0037 749A 117 MOV A,#9AH ;最低字节单独取补
0039 96 118 SUBB A,@R0
003A F6 119 MOV @R0,A
003B EB 120 MOV A,R3 ;恢复指针
003C F8 121 MOV R0,A
003D 22 122 RET
123
124 ; (4)标号:BRLN 功能:多字节BCD码左移十进制一位(乘十)
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 3
125
126 ;入口条件:字节数在R7中,操作数在[R0]中。
127 ;出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
128 ;影响资源:PSW、A、R2、R3 堆栈需求: 2字节
129
003E 130 BRLN:
003E EF 131 MOV A,R7 ;取字节数至R2中
003F FA 132 MOV R2,A
0040 28 133 ADD A,R0 ;初始化数据指针
0041 F8 134 MOV R0,A
0042 7B00 135 MOV R3,#0 ;工作单元初始化
0044 136 BRL1:
0044 18 137 DEC R0 ;调整数据指针
138
0045 E6 139 MOV A,@R0 ;取一字节
0046 C4 140 SWAP A ;交换十进制高低位
0047 F6 141 MOV @R0,A ;存回
0048 EB 142 MOV A,R3 ;取低字节移出的十进制高位
0049 D6 143 XCHD A,@R0 ;换出本字节的十进制高位
004A FB 144 MOV R3,A ;保存本字节的十进制高位
004B DAF7 145 DJNZ R2,BRL1 ;处理完所有字节
004D 22 146 RET
147
148 ; (5)标号:MULD 功能:双字节二进制无符号数乘法
149
150 ;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
151 ;出口信息:乘积在R2、R3、R4、R5中。
152 ;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节
153
004E 154 MULD:
004E EB 155 MOV A,R3 ;计算R3乘R7
004F 8FF0 156 MOV B,R7
157
0051 A4 158 MUL AB
0052 ACF0 159 MOV R4,B ;暂存部分积
0054 FD 160 MOV R5,A
0055 EB 161 MOV A,R3 ;计算R3乘R6
0056 8EF0 162 MOV B,R6
0058 A4 163 MUL AB
0059 2C 164 ADD A,R4 ;累加部分积
005A FC 165 MOV R4,A
005B E4 166 CLR A
005C 35F0 167 ADDC A,B
005E FB 168 MOV R3,A
005F EA 169 MOV A,R2 ;计算R2乘R7
0060 8FF0 170 MOV B,R7
0062 A4 171 MUL AB
0063 2C 172 ADD A,R4 ;累加部分积
0064 FC 173 MOV R4,A
0065 EB 174 MOV A,R3
0066 35F0 175 ADDC A,B
0068 FB 176 MOV R3,A
0069 E4 177 CLR A
006A 33 178 RLC A
006B CA 179 XCH A,R2 ;计算R2乘R6
006C 8EF0 180 MOV B,R6
006E A4 181 MUL AB
006F 2B 182 ADD A,R3 ;累加部分积
0070 FB 183 MOV R3,A
0071 EA 184 MOV A,R2
0072 35F0 185 ADDC A,B
0074 FA 186 MOV R2,A
0075 22 187 RET
188
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -