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

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

📁 单片机汇编代码
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            ;第一操作数左规一次<BR>RLC A ;尾数扩大一倍<BR>MOV R4,A<BR>MOV A,R3<BR>RLC A<BR>MOV 
            R3,A<BR>DEC R2 ;阶码减一<BR>CJNE R2,#0C0H,RL1E;阶码下溢否?<BR>CLR A<BR>MOV 
            R3,A ;阶码下溢,操作数以零计<BR>MOV R4,A<BR>MOV R2,#0C1H<BR>RL1E: CLR 
            OV<BR>RET<BR>RR1: MOV A,R3 ;第一操作数右规一次<BR>RRC A ;尾数缩小一半<BR>MOV 
            R3,A<BR>MOV A,R4<BR>RRC A<BR>MOV R4,A<BR>INC R2 ;阶码加一<BR>CLR OV 
            ;清溢出标志<BR>CJNE R2,#40H,RR1E;阶码上溢否?<BR>MOV R2,#3FH ;阶码溢出<BR>SETB 
            OV<BR>RR1E: RET<BR> <BR>(4) 标号: FMUL 
            功能:浮点数乘法<BR><BR>入口条件:被乘数在[R0]中,乘数在[R1]中。<BR>出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出。<BR>影响资源:PSW、A、B、R2~R7、位1EH、1FH 
            堆栈需求:6字节<BR>FMUL: LCALL MVR0 ;将[R0]传送到第一工作区中<BR>MOV A,@R0<BR>XRL 
            A,@R1 ;比较两个操作数的符号<BR>RLC A<BR>MOV 1FH,C ;保存积的符号<BR>LCALL MUL0 
            ;计算积的绝对值<BR>LJMP MOV0 ;将结果传回到[R0]中<BR>MUL0: LCALL MVR1 
            ;将[R1]传送到第二工作区中<BR>MUL1: MOV A,R3 ;第一尾数为零否?<BR>ORL A,R4<BR>JZ 
            MUL6<BR>MOV A,R6 ;第二尾数为零否?<BR>ORL A,R7<BR>JZ MUL5<BR>MOV A,R7 
            ;计算R3R4×R6R7-→R3R4<BR>MOV B,R4<BR>MUL AB<BR>MOV A,B<BR>XCH 
            A,R7<BR>MOV B,R3<BR>MUL AB<BR>ADD A,R7<BR>MOV R7,A<BR>CLR A<BR>ADDC 
            A,B<BR>XCH A,R4<BR>MOV B,R6<BR>MUL AB<BR>ADD A,R7<BR>MOV R7,A<BR>MOV 
            A,B<BR>ADDC A,R4<BR>MOV R4,A<BR>CLR A<BR>RLC A<BR>XCH A,R3<BR>MOV 
            B,R6<BR>MUL AB<BR>ADD A,R4<BR>MOV R4,A<BR>MOV A,B<BR>ADDC 
            A,R3<BR>MOV R3,A<BR>JB ACC.7,MUL2;积为规格化数否?<BR>MOV A,R7 ;左规一次<BR>RLC 
            A<BR>MOV R7,A<BR>LCALL RL1<BR>MUL2: MOV A,R7<BR>JNB 
            ACC.7,MUL3<BR>INC R4<BR>MOV A,R4<BR>JNZ MUL3<BR>INC R3<BR>MOV 
            A,R3<BR>JNZ MUL3<BR>MOV R3,#80H<BR>INC R2<BR>MUL3: MOV A,R2 
            ;求积的阶码<BR>ADD A,R5<BR>MD: MOV R2,A ;阶码溢出判断<BR>JB ACC.7,MUL4<BR>JNB 
            ACC.6,MUL6<BR>MOV R2,#3FH ;阶码上溢,设立标志<BR>SETB OV<BR>RET<BR>MUL4: JB 
            ACC.6,MUL6<BR>MUL5: CLR A ;结果清零(因子为零或阶码下溢)<BR>MOV R3,A<BR>MOV 
            R4,A<BR>MOV R2,#41H<BR>MUL6: CLR OV<BR>RET<BR> <BR>(5) 标号: FDIV 
            功能:浮点数除法<BR><BR>入口条件:被除数在[R0]中,除数在[R1]中。<BR>出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。<BR>影响资源:PSW、A、B、R2~R7、位1EH、1FH 
            堆栈需求: 5字节<BR>FDIV: INC R0<BR>MOV A,@R0<BR>INC R0<BR>ORL A,@R0<BR>DEC 
            R0<BR>DEC R0<BR>JNZ DIV1<BR>MOV @R0,#41H;被除数为零,不必运算<BR>CLR 
            OV<BR>RET<BR>DIV1: INC R1<BR>MOV A,@R1<BR>INC R1 <BR>ORL 
            A,@R1<BR>DEC R1<BR>DEC R1 <BR>JNZ DIV2 <BR>SETB OV ;除数为零,溢出<BR>RET 
            <BR>DIV2: LCALL MVR0 ;将[R0]传送到第一工作区中<BR>MOV A,@R0<BR>XRL A,@R1 
            ;比较两个操作数的符号<BR>RLC A<BR>MOV 1FH,C ;保存结果的符号<BR>LCALL MVR1 
            ;将[R1]传送到第二工作区中<BR>LCALL DIV3 ;调用工作区浮点除法<BR>LJMP MOV0 ;回传结果<BR>DIV3: 
            CLR C ;比较尾数的大小<BR>MOV A,R4<BR>SUBB A,R7<BR>MOV A,R3<BR>SUBB 
            A,R6<BR>JC DIV4<BR>LCALL RR1 ;被除数右规一次<BR>SJMP DIV3<BR>DIV4: CLR A 
            ;借用R0R1R2作工作寄存器<BR>XCH A,R0 ;清零并保护之<BR>PUSH ACC<BR>CLR A<BR>XCH 
            A,R1<BR>PUSH ACC<BR>MOV A,R2<BR>PUSH ACC<BR>MOV B,#10H 
            ;除法运算,R3R4/R6R7-→R0R1<BR>DIV5: CLR C<BR>MOV A,R1<BR>RLC A<BR>MOV 
            R1,A<BR>MOV A,R0<BR>RLC A<BR>MOV R0,A<BR>MOV A,R4<BR>RLC A<BR>MOV 
            R4,A<BR>XCH A,R3<BR>RLC A<BR>XCH A,R3<BR>MOV F0,C<BR>CLR C<BR>SUBB 
            A,R7<BR>MOV R2,A<BR>MOV A,R3<BR>SUBB A,R6<BR>ANL C,/F0<BR>JC 
            DIV6<BR>MOV R3,A<BR>MOV A,R2<BR>MOV R4,A<BR>INC R1<BR>DIV6: DJNZ 
            B,DIV5<BR>MOV A,R6 ;四舍五入<BR>CLR C<BR>RRC A<BR>SUBB A,R3<BR>CLR 
            A<BR>ADDC A,R1 ;将结果存回R3R4<BR>MOV R4,A<BR>CLR A<BR>ADDC A,R0<BR>MOV 
            R3,A<BR>POP ACC ;恢复R0R1R2<BR>MOV R2,A<BR>POP ACC<BR>MOV R1,A<BR>POP 
            ACC<BR>MOV R0,A<BR>MOV A,R2 ;计算商的阶码<BR>CLR C<BR>SUBB A,R5<BR>LCALL 
            MD ;阶码检验<BR>LJMP RLN ;规格化<BR><BR>(6) 标号: FCLR 
            功能:浮点数清零<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:操作数被清零。<BR>影响资源:A 堆栈需求: 
            2字节<BR>FCLR: INC R0<BR>INC R0<BR>CLR A<BR>MOV @R0,A<BR>DEC R0<BR>MOV 
            @R0,A<BR>DEC R0<BR>MOV @R0,#41H<BR>RET <BR> <BR>(7) 标号: FZER 
            功能:浮点数判零<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。<BR>影响资源:A 
            堆栈需求: 2字节<BR>FZER: INC R0<BR>INC R0<BR>MOV A,@R0<BR>DEC R0<BR>ORL 
            A,@R0<BR>DEC R0<BR>JNZ ZERO<BR>MOV @R0,#41H<BR>ZERO: RET <BR><BR>(8) 
            标号: FMOV 
            功能:浮点数传送<BR><BR>入口条件:源操作数在[R1]中,目标地址为[R0]。<BR>出口信息:[R0]=[R1],[R1]不变。<BR>影响资源:A 
            堆栈需求: 2字节<BR>FMOV: INC R0<BR>INC R0<BR>INC R1<BR>INC R1<BR>MOV 
            A,@R1<BR>MOV @R0,A<BR>DEC R0<BR>DEC R1<BR>MOV A,@R1<BR>MOV 
            @R0,A<BR>DEC R0<BR>DEC R1<BR>MOV A,@R1<BR>MOV 
            @R0,A<BR>RET<BR> <BR>(9) 标号: FPUS 
            功能:浮点数压栈<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:操作数压入栈顶。<BR>影响资源:A、R2、R3 
            堆栈需求: 5字节<BR>FPUS: POP ACC ;将返回地址保存在R2R3中<BR>MOV R2,A<BR>POP 
            ACC<BR>MOV R3,A<BR>MOV A,@R0 ;将操作数压入堆栈<BR>PUSH ACC<BR>INC R0<BR>MOV 
            A,@R0<BR>PUSH ACC<BR>INC R0<BR>MOV A,@R0<BR>PUSH ACC<BR>DEC 
            R0<BR>DEC R0<BR>MOV A,R3 ;将返回地址压入堆栈<BR>PUSH ACC<BR>MOV A,R2<BR>PUSH 
            ACC<BR>RET ;返回主程序<BR><BR>(10) 标号: FPOP 
            功能:浮点数出栈<BR><BR>入口条件:操作数处于栈顶。<BR>出口信息:操作数弹至[R0]中。<BR>影响资源:A、R2、R3 
            堆栈需求: 2字节<BR>FPOP: POP ACC ;将返回地址保存在R2R3中<BR>MOV R2,A<BR>POP 
            ACC<BR>MOV R3,A<BR>INC R0<BR>INC R0<BR>POP ACC 
            ;将操作数弹出堆栈,传送到[R0]中<BR>MOV @R0,A<BR>DEC R0<BR>POP ACC<BR>MOV 
            @R0,A<BR>DEC R0<BR>POP ACC<BR>MOV @R0,A<BR>MOV A,R3 
            ;将返回地址压入堆栈<BR>PUSH ACC<BR>MOV A,R2<BR>PUSH ACC<BR>RET 
            ;返回主程序<BR><BR>(11) 标号: FCMP 
            功能:浮点数代数值比较(不影响待比较操作数)<BR><BR>入口条件:待比较操作数分别在[R0]和[R1]中。<BR>出口信息:若CY=1,则[R0] 
            &lt; [R1],若CY=0且A=0则 [R0] = [R1],否则[R0] &gt; [R1]。<BR>影响资源:A、B、PSW 
            堆栈需求: 2字节<BR>FCMP: MOV A,@R0 ;数符比较<BR>XRL A,@R1<BR>JNB 
            ACC.7,CMP2<BR>MOV A,@R0 ;两数异号,以[R0]数符为准<BR>RLC A<BR>MOV 
            A,#0FFH<BR>RET <BR>CMP2: MOV A,@R1 ;两数同号,准备比较阶码<BR>MOV 
            C,ACC.6<BR>MOV ACC.7,C<BR>MOV B,A<BR>MOV A,@R0<BR>MOV C,ACC.7<BR>MOV 
            F0,C ;保存[R0]的数符<BR>MOV C,ACC.6<BR>MOV ACC.7,C<BR>CLR C ;比较阶码<BR>SUBB 
            A,B<BR>JZ CMP6<BR>RLC A ;取阶码之差的符号<BR>JNB F0,CMP5<BR>CPL C 
            ;[R0]为负时,结果取反<BR>CMP5: MOV A,#0FFH ;两数不相等<BR>RET <BR>CMP6: INC R0 
            ;阶码相同时,准备比较尾数<BR>INC R0<BR>INC R1<BR>INC R1<BR>CLR C<BR>MOV 
            A,@R0<BR>SUBB A,@R1<BR>MOV B,A ;保存部分差 <BR>DEC R0<BR>DEC R1<BR>MOV 
            A,@R0<BR>SUBB A,@R1<BR>DEC R0<BR>DEC R1<BR>ORL A,B ;生成是否相等信息<BR>JZ 
            CMP7<BR>JNB F0,CMP7<BR>CPL C ;[R0]为负时,结果取反<BR>CMP7: RET<BR> <BR>(12) 
            标号: FABS 
            功能:浮点绝对值函数<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:结果仍在[R0]中。<BR>影响资源:A 堆栈需求: 
            2字节<BR>FABS: MOV A,@R0 ;读取操作数的阶码<BR>CLR ACC.7 ;清除数符<BR>MOV @R0,A 
            ;回传阶码<BR>RET<BR><BR>(13) 标号: FSGN 
            功能:浮点符号函数<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 
            时为零。<BR>影响资源:PSW、A 堆栈需求: 2字节<BR>FSGN: INC R0 ;读尾数<BR>MOV 
            A,@R0<BR>INC R0<BR>ORL A,@R0<BR>DEC R0<BR>DEC R0<BR>JNZ SGN<BR>RET 
            ;尾数为零,结束<BR>SGN: MOV A,@R0 ;读取操作数的阶码<BR>RLC A ;取数符<BR>MOV A,#1 
            ;按正数初始化<BR>JNC SGN1 ;是正数,结束<BR>MOV A,#0FFH ;是负数,改变标志<BR>SGN1: 
            RET<BR><BR>(14) 标号: FINT 
            功能:浮点取整函数<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:结果仍在[R0]中。<BR>影响资源:PSW、A、R2、R3、R4、位1FH 
            堆栈需求: 6字节<BR>FINT: LCALL MVR0 ;将[R0]传送到第一工作区中<BR>LCALL INT 
            ;在工作寄存器中完成取整运算<BR>LJMP MOV0 ;将结果传回到[R0]中<BR>INT: MOV A,R3<BR>ORL 
            A,R4<BR>JNZ INTA<BR>CLR 1FH ;尾数为零,阶码也清零,结束取整<BR>MOV R2,#41H<BR>RET 
            <BR>INTA: MOV A,R2<BR>JZ INTB ;阶码为零否?<BR>JB ACC.7,INTB;阶符为负否?<BR>CLR 
            C<BR>SUBB A,#10H ;阶码小于16否?<BR>JC INTD<BR>RET ;阶码大于16,已经是整数<BR>INTB: 
            CLR A ;绝对值小于一,取整后正数为零,负数为负一<BR>MOV R4,A<BR>MOV C,1FH<BR>RRC A<BR>MOV 
            R3,A<BR>RL A<BR>MOV R2,A<BR>JNZ INTC<BR>MOV R2,#41H<BR>INTC: 
            RET<BR>INTD: CLR F0 ;舍尾标志初始化<BR>INTE: CLR C<BR>LCALL RR1 
            ;右规一次<BR>ORL C,F0 ;记忆舍尾情况<BR>MOV F0,C<BR>CJNE 
            R2,#10H,INTE;阶码达到16(尾数完全为整数)否?<BR>JNB F0,INTF ;舍去部分为零否?<BR>JNB 
            1FH,INTF;操作数为正数否?<BR>INC R4 ;对于带小数的负数,向下取整<BR>MOV A,R4<BR>JNZ 
            INTF<BR>INC R3<BR>INTF: LJMP RLN ;将结果规格化<BR><BR>(15) 标号: FRCP 
            功能:浮点倒数函数<BR><BR>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。<BR>影响资源:PSW、A、B、R2~R7、位1EH、1FH 
            堆栈需求: 5字节<BR>FRCP: MOV A,@R0<BR>MOV C,ACC.7<BR>MOV 1FH,C 
            ;保存数符<BR>MOV C,ACC.6 ;绝对值传送到第二工作区<BR>MOV ACC.7,C<BR>MOV R5,A<BR>INC 
            R0<BR>MOV A,@R0<BR>MOV R6,A<BR>INC R0<BR>MOV A,@R0<BR>MOV 
            R7,A<BR>DEC R0<BR>DEC R0<BR>ORL A,R6<BR>JNZ RCP<BR>SETB OV 
            ;零不能求倒数,设立溢出标志<BR>RET <BR>RCP: MOV A,R6<BR>JB 
            ACC.7,RCP2;操作数格式化否?<BR>CLR C ;格式化之<BR>MOV A,R7<BR>RLC A<BR>MOV 
            R7,A<BR>MOV A,R6<BR>RLC A<BR>MOV R6,A<BR>DEC R5<BR>SJMP RCP<BR>RCP2: 
            MOV R2,#1 ;将数值1.00传送到第一工作区<BR>MOV R3,#80H<BR>MOV R4,#0<BR>LCALL DIV3 
            ;调用工作区浮点除法,求得倒数<BR>LJMP MOV0 ;回传结果<BR><BR>(16) 标号: 

⌨️ 快捷键说明

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