⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51.lst

📁 单片机定点运算子程序库
💻 LST
📖 第 1 页 / 共 5 页
字号:
0128 7D00            384             MOV     R5,#0
012A 12014C          385             LCALL   MDS     ;计算结果的符号和两个操作数的绝对值
012D 12004E          386             LCALL   MULD    ;计算两个绝对值的乘积
0130 8014            387             SJMP    MDSE    ;用补码表示结果
                     388     
A51 MACRO ASSEMBLER  51                                                                   06/29/2007 15:34:54 PAGE     7

                     389     ;(11)标号:DIVS 功能:双字节二进制有符号数除法(补码)
                     390     
                     391     ;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
                     392     ;出口信息:OV=0时商在R2、R3中,OV=1时溢出。
                     393     ;影响资源:PSW、A、B、R1~R7    堆栈需求:  5字节
                     394     
0132 12014C          395     DIVS:   LCALL   MDS     ;计算结果的符号和两个操作数的绝对值
0135 C0D0            396             PUSH    PSW     ;保存结果的符号
0137 12009A          397             LCALL   DIVD    ;计算两个绝对值的商
013A 30D203          398             JNB     OV,DVS1 ;溢出否?
013D D0E0            399             POP     ACC     ;溢出,放去结果的符号,保留溢出标志
013F 22              400             RET
0140 D0D0            401     DVS1:   POP     PSW     ;未溢出,取出结果的符号
0142 7C00            402             MOV     R4,#0
0144 7D00            403             MOV     R5,#0
0146 20D51A          404     MDSE:   JB      F0,MDS2 ;用补码表示结果
0149 C2D2            405             CLR     OV      ;结果为正,原码即补码,计算成功
                     406     
014B 22              407             RET
014C C2D5            408     MDS:    CLR     F0      ;结果符号初始化
014E EE              409             MOV     A,R6    ;判断第二操作数的符号
014F 30E70B          410             JNB     ACC.7,MDS1  ;为正,不必处理
0152 B2D5            411             CPL     F0      ;为负,结果符号取反
0154 CF              412             XCH     A,R7    ;第二操作数取补,得到其绝对值
0155 F4              413             CPL     A
0156 2401            414             ADD     A,#1
0158 CF              415             XCH     A,R7
0159 F4              416             CPL     A
015A 3400            417             ADDC    A,#0
015C FE              418             MOV     R6,A
015D EA              419     MDS1:   MOV     A,R2    ;判断第一操作数或运算结果的符号
015E 30E716          420             JNB     ACC.7,MDS3 ;为正,不必处理
0161 B2D5            421             CPL     F0      ;为负,结果符号取反
0163 ED              422     MDS2:   MOV     A,R5    ;求第一操作数的绝对值或运算结果的补码
0164 F4              423             CPL     A
0165 2401            424             ADD     A,#1
0167 FD              425             MOV     R5,A
                     426     
0168 EC              427             MOV     A,R4
0169 F4              428             CPL     A
016A 3400            429             ADDC    A,#0
016C FC              430             MOV     R4,A
016D EB              431             MOV     A,R3
016E F4              432             CPL     A
016F 3400            433             ADDC    A,#0
0171 FB              434             MOV     R3,A
0172 EA              435             MOV     A,R2
0173 F4              436             CPL     A
0174 3400            437             ADDC    A,#0
0176 FA              438             MOV     R2,A
0177 C2D2            439     MDS3:   CLR     OV      ;运算成功
0179 22              440             RET
                     441     
                     442     ;(12)标号:SH2 功能:双字节二进制无符号数开平方(快速)
                     443     
                     444     ;入口条件:被开方数在R2、R3中。
                     445     ;出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
                     446     ;影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节
                     447     
017A EA              448     SH2:    MOV     A,R2
017B 4B              449             ORL     A,R3
017C 7001            450             JNZ     SH20
017E 22              451             RET              ;被开方数为零,不必运算
                     452     
017F 7F00            453     SH20:   MOV     R7,#0    ;左规次数初始化
0181 EA              454             MOV     A,R2
A51 MACRO ASSEMBLER  51                                                                   06/29/2007 15:34:54 PAGE     8

0182 54C0            455     SH22:   ANL     A,#0C0H  ;被开方数高字节小于40H否?
0184 7035            456             JNZ     SQRH     ;不小于40H,左规格化完成,转开方过程
0186 C3              457             CLR     C        ;每左规一次,被开方数左移两位
0187 EB              458             MOV     A,R3
0188 33              459             RLC     A
0189 92D5            460             MOV     F0,C
018B C3              461             CLR     C
018C 33              462             RLC     A
018D FB              463             MOV     R3,A
018E EA              464             MOV     A,R2
018F 92E7            465             MOV     ACC.7,C
0191 A2D5            466             MOV     C,F0
0193 33              467             RLC     A
0194 33              468             RLC     A
0195 FA              469             MOV     R2,A
0196 0F              470             INC     R7       ;左规次数加一
0197 80E9            471             SJMP    SH22     ;继续左规
                     472     
                     473     ;(13)标号: SH4 功能:四字节二进制无符号数开平方(快速)
                     474     
                     475     ;入口条件:被开方数在R2、R3、R4、R5中。
                     476     
                     477     ;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
                     478     ;影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节
                     479     
0199 EA              480     SH4:    MOV     A,R2
019A 4B              481             ORL     A,R3
019B 4C              482             ORL     A,R4
019C 4D              483             ORL     A,R5
019D 7001            484             JNZ     SH40
019F 22              485             RET              ;被开方数为零,不必运算
01A0 7F00            486     SH40:   MOV     R7,#0    ;左规次数初始化
01A2 EA              487             MOV     A,R2
01A3 54C0            488     SH41:   ANL     A,#0C0H  ;被开方数高字节小于40H否?
01A5 7014            489             JNZ     SQRH     ;不小于40H,左规格化完成
01A7 7E02            490             MOV     R6,#2    ;每左规一次,被开方数左移两位
01A9 C3              491     SH42:   CLR     C        ;被开方数左移一位
01AA ED              492             MOV     A,R5
01AB 33              493             RLC     A
                     494     
01AC FD              495             MOV     R5,A
01AD EC              496             MOV     A,R4
01AE 33              497             RLC     A
01AF FC              498             MOV     R4,A
01B0 EB              499             MOV     A,R3
01B1 33              500             RLC     A
01B2 FB              501             MOV     R3,A
01B3 EA              502             MOV     A,R2
01B4 33              503             RLC     A
01B5 FA              504             MOV     R2,A
01B6 DEF1            505             DJNZ    R6,SH42  ;被开方数左移完两位
01B8 0F              506             INC     R7       ;左规次数加一
01B9 80E8            507             SJMP    SH41     ;继续左规
01BB EA              508     SQRH:   MOV     A,R2     ;规格化后高字节按折线法分为三个区间
01BC 2457            509             ADD     A,#57H
01BE 4014            510             JC      SQR2
01C0 2445            511             ADD     A,#45H
01C2 4009            512             JC      SQR1
01C4 2424            513             ADD     A,#24H
01C6 75F0E3          514             MOV     B,#0E3H  ;第一区间的斜率
01C9 7C80            515             MOV     R4,#80H  ;第一区间的平方根基数
01CB 800C            516             SJMP    SQR3
01CD 75F0B2          517     SQR1:   MOV     B,#0B2H  ;第二区间的斜率
01D0 7CA0            518             MOV     R4,#0A0H ;第二区间的平方根基数
                     519     
01D2 8005            520             SJMP    SQR3
A51 MACRO ASSEMBLER  51                                                                   06/29/2007 15:34:54 PAGE     9

01D4 75F08D          521     SQR2:   MOV     B,#8DH   ;第三区间的斜率
01D7 7CD0            522             MOV     R4,#0D0H ;第三区间的平方根基数
01D9 A4              523     SQR3:   MUL     AB       ;与区间基点的偏移量乘区间斜率
01DA E5F0            524             MOV     A,B
01DC 2C              525             ADD     A,R4     ;累加到平方根的基数上
01DD FC              526             MOV     R4,A
01DE F5F0            527             MOV     B,A
01E0 A4              528             MUL     AB       ;求当前平方根的幂
01E1 CB              529             XCH     A,R3     ;求偏移量(存放在R2R3中)
01E2 C3              530             CLR     C
01E3 9B              531             SUBB    A,R3
01E4 FB              532             MOV     R3,A
01E5 EA              533             MOV     A,R2
01E6 95F0            534             SUBB    A,B
01E8 FA              535             MOV     R2,A
01E9 D3              536     SQR4:   SETB    C        ;用减奇数法校正一个字节的平方根
01EA EC              537             MOV     A,R4     ;当前平方根的两倍加一存入R5R6中
01EB 33              538             RLC     A
01EC FE              539             MOV     R6,A
                     540     
01ED E4              541             CLR     A
01EE 33              542             RLC     A
01EF FD              543             MOV     R5,A
01F0 EB              544             MOV     A,R3     ;偏移量小于该奇数否?
01F1 9E              545             SUBB    A,R6
01F2 F5F0            546             MOV     B,A
01F4 EA              547             MOV     A,R2
01F5 9D              548             SUBB    A,R5
01F6 4006            549             JC      SQR5     ;小于,校正结束,已达到一个字节的精度
01F8 0C              550             INC     R4       ;不小于,平方根加一
01F9 FA              551             MOV     R2,A     ;保存新的偏移量
01FA ABF0            552             MOV     R3,B
01FC 80EB            553             SJMP    SQR4     ;继续校正
01FE EC              554     SQR5:   MOV     A,R4     ;将一个字节精度的根存入R2
01FF CA              555             XCH     A,R2
0200 13              556             RRC     A
0201 92D5            557             MOV     F0,C     ;保存最终偏移量的最高位
0203 EB              558             MOV     A,R3
0204 FD              559             MOV     R5,A     ;将最终偏移量的低八位存入R5中
0205 7C08            560             MOV     R4,#8    ;通过(R5R6/R2)求根的低字节
                     561     
0207 C3              562     SQR6:   CLR     C
0208 EB              563             MOV     A,R3
0209 33              564             RLC     A
020A FB              565             MOV     R3,A
020B C3              566             CLR     C
020C ED              567             MOV     A,R5
020D 9A              568             SUBB    A,R2
020E 20D502          569             JB      F0,SQR7
0211 4002            570             JC      SQR8
0213 FD              571     SQR7:   MOV     R5,A
0214 0B              572             INC     R3
0215 C3              573     SQR8:   CLR     C
0216 ED              574             MOV     A,R5
0217 33              575             RLC     A
0218 FD              576             MOV     R5,A
0219 92D5            577             MOV     F0,C
021B DCEA            578             DJNZ    R4,SQR6  ;根的第二字节计算完,在R3中

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -