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

📄 mcs-51单片机实用子程序库.txt

📁 目前已有若干版本的子程序库公开发表
💻 TXT
📖 第 1 页 / 共 5 页
字号:
            MOV R3,A
            JNC AS2
            LJMP RR1 ;有进位,右规一次
            AS5: CLR C ;比较绝对值大小
            MOV A,R4
            SUBB A,R7
            MOV B,A
            MOV A,R3
            SUBB A,R6
            JC AS6
            MOV R4,B ;第一尾数减第二尾数
            MOV R3,A
            LJMP RLN ;结果规格化
            AS6: CPL 1FH ;结果的符号与第一操作数相反
            CLR C ;结果的绝对值为第二尾数减第一尾数
            MOV A,R7
            SUBB A,R4
            MOV R4,A
            MOV A,R6
            SUBB A,R3
            MOV R3,A
            RLN: MOV A,R3 ;浮点数规格化
            ORL A,R4 ;尾数为零否?
            JNZ RLN1
            MOV R2,#0C1H;阶码取最小值
            RET 
            RLN1: MOV A,R3
            JB ACC.7,RLN2;尾数最高位为一否?
            CLR C ;不为一,左规一次
            LCALL RL1
            SJMP RLN ;继续判断
            RLN2: CLR OV ;规格化结束
            RET
            RL1: MOV A,R4 ;第一操作数左规一次
            RLC A ;尾数扩大一倍
            MOV R4,A
            MOV A,R3
            RLC A
            MOV R3,A
            DEC R2 ;阶码减一
            CJNE R2,#0C0H,RL1E;阶码下溢否?
            CLR A
            MOV R3,A ;阶码下溢,操作数以零计
            MOV R4,A
            MOV R2,#0C1H
            RL1E: CLR OV
            RET
            RR1: MOV A,R3 ;第一操作数右规一次
            RRC A ;尾数缩小一半
            MOV R3,A
            MOV A,R4
            RRC A
            MOV R4,A
            INC R2 ;阶码加一
            CLR OV ;清溢出标志
            CJNE R2,#40H,RR1E;阶码上溢否?
            MOV R2,#3FH ;阶码溢出
            SETB OV
            RR1E: RET
             
            (4) 标号: FMUL 功能:浮点数乘法

            入口条件:被乘数在[R0]中,乘数在[R1]中。
            出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出。
            影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节
            FMUL: LCALL MVR0 ;将[R0]传送到第一工作区中
            MOV A,@R0
            XRL A,@R1 ;比较两个操作数的符号
            RLC A
            MOV 1FH,C ;保存积的符号
            LCALL MUL0 ;计算积的绝对值
            LJMP MOV0 ;将结果传回到[R0]中
            MUL0: LCALL MVR1 ;将[R1]传送到第二工作区中
            MUL1: MOV A,R3 ;第一尾数为零否?
            ORL A,R4
            JZ MUL6
            MOV A,R6 ;第二尾数为零否?
            ORL A,R7
            JZ MUL5
            MOV A,R7 ;计算R3R4×R6R7-→R3R4
            MOV B,R4
            MUL AB
            MOV A,B
            XCH A,R7
            MOV B,R3
            MUL AB
            ADD A,R7
            MOV R7,A
            CLR A
            ADDC A,B
            XCH A,R4
            MOV B,R6
            MUL AB
            ADD A,R7
            MOV R7,A
            MOV A,B
            ADDC A,R4
            MOV R4,A
            CLR A
            RLC A
            XCH A,R3
            MOV B,R6
            MUL AB
            ADD A,R4
            MOV R4,A
            MOV A,B
            ADDC A,R3
            MOV R3,A
            JB ACC.7,MUL2;积为规格化数否?
            MOV A,R7 ;左规一次
            RLC A
            MOV R7,A
            LCALL RL1
            MUL2: MOV A,R7
            JNB ACC.7,MUL3
            INC R4
            MOV A,R4
            JNZ MUL3
            INC R3
            MOV A,R3
            JNZ MUL3
            MOV R3,#80H
            INC R2
            MUL3: MOV A,R2 ;求积的阶码
            ADD A,R5
            MD: MOV R2,A ;阶码溢出判断
            JB ACC.7,MUL4
            JNB ACC.6,MUL6
            MOV R2,#3FH ;阶码上溢,设立标志
            SETB OV
            RET
            MUL4: JB ACC.6,MUL6
            MUL5: CLR A ;结果清零(因子为零或阶码下溢)
            MOV R3,A
            MOV R4,A
            MOV R2,#41H
            MUL6: CLR OV
            RET
             
            (5) 标号: FDIV 功能:浮点数除法

            入口条件:被除数在[R0]中,除数在[R1]中。
            出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。
            影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节
            FDIV: INC R0
            MOV A,@R0
            INC R0
            ORL A,@R0
            DEC R0
            DEC R0
            JNZ DIV1
            MOV @R0,#41H;被除数为零,不必运算
            CLR OV
            RET
            DIV1: INC R1
            MOV A,@R1
            INC R1 
            ORL A,@R1
            DEC R1
            DEC R1 
            JNZ DIV2 
            SETB OV ;除数为零,溢出
            RET 
            DIV2: LCALL MVR0 ;将[R0]传送到第一工作区中
            MOV A,@R0
            XRL A,@R1 ;比较两个操作数的符号
            RLC A
            MOV 1FH,C ;保存结果的符号
            LCALL MVR1 ;将[R1]传送到第二工作区中
            LCALL DIV3 ;调用工作区浮点除法
            LJMP MOV0 ;回传结果
            DIV3: CLR C ;比较尾数的大小
            MOV A,R4
            SUBB A,R7
            MOV A,R3
            SUBB A,R6
            JC DIV4
            LCALL RR1 ;被除数右规一次
            SJMP DIV3
            DIV4: CLR A ;借用R0R1R2作工作寄存器
            XCH A,R0 ;清零并保护之
            PUSH ACC
            CLR A
            XCH A,R1
            PUSH ACC
            MOV A,R2
            PUSH ACC
            MOV B,#10H ;除法运算,R3R4/R6R7-→R0R1
            DIV5: CLR C
            MOV A,R1
            RLC A
            MOV R1,A
            MOV A,R0
            RLC A
            MOV R0,A
            MOV A,R4
            RLC A
            MOV R4,A
            XCH A,R3
            RLC A
            XCH A,R3
            MOV F0,C
            CLR C
            SUBB A,R7
            MOV R2,A
            MOV A,R3
            SUBB A,R6
            ANL C,/F0
            JC DIV6
            MOV R3,A
            MOV A,R2
            MOV R4,A
            INC R1
            DIV6: DJNZ B,DIV5
            MOV A,R6 ;四舍五入
            CLR C
            RRC A
            SUBB A,R3
            CLR A
            ADDC A,R1 ;将结果存回R3R4
            MOV R4,A
            CLR A
            ADDC A,R0
            MOV R3,A
            POP ACC ;恢复R0R1R2
            MOV R2,A
            POP ACC
            MOV R1,A
            POP ACC
            MOV R0,A
            MOV A,R2 ;计算商的阶码
            CLR C
            SUBB A,R5
            LCALL MD ;阶码检验
            LJMP RLN ;规格化

            (6) 标号: FCLR 功能:浮点数清零

            入口条件:操作数在[R0]中。
            出口信息:操作数被清零。
            影响资源:A 堆栈需求: 2字节
            FCLR: INC R0
            INC R0
            CLR A
            MOV @R0,A
            DEC R0
            MOV @R0,A
            DEC R0
            MOV @R0,#41H
            RET 
             
            (7) 标号: FZER 功能:浮点数判零

            入口条件:操作数在[R0]中。
            出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。
            影响资源:A 堆栈需求: 2字节
            FZER: INC R0
            INC R0
            MOV A,@R0
            DEC R0
            ORL A,@R0
            DEC R0
            JNZ ZERO
            MOV @R0,#41H
            ZERO: RET 

            (8) 标号: FMOV 功能:浮点数传送

            入口条件:源操作数在[R1]中,目标地址为[R0]。
            出口信息:[R0]=[R1],[R1]不变。
            影响资源:A 堆栈需求: 2字节
            FMOV: INC R0
            INC R0
            INC R1
            INC R1
            MOV A,@R1
            MOV @R0,A
            DEC R0
            DEC R1
            MOV A,@R1
            MOV @R0,A
            DEC R0
            DEC R1
            MOV A,@R1
            MOV @R0,A
            RET
             
            (9) 标号: FPUS 功能:浮点数压栈

            入口条件:操作数在[R0]中。
            出口信息:操作数压入栈顶。
            影响资源:A、R2、R3 堆栈需求: 5字节
            FPUS: POP ACC ;将返回地址保存在R2R3中
            MOV R2,A
            POP ACC
            MOV R3,A
            MOV A,@R0 ;将操作数压入堆栈
            PUSH ACC
            INC R0
            MOV A,@R0
            PUSH ACC
            INC R0
            MOV A,@R0
            PUSH ACC
            DEC R0
            DEC R0
            MOV A,R3 ;将返回地址压入堆栈
            PUSH ACC
            MOV A,R2
            PUSH ACC
            RET ;返回主程序

            (10) 标号: FPOP 功能:浮点数出栈

            入口条件:操作数处于栈顶。
            出口信息:操作数弹至[R0]中。
            影响资源:A、R2、R3 堆栈需求: 2字节
            FPOP: POP ACC 

⌨️ 快捷键说明

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