MCS-51单片机实用子程序库 (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 ;将返回地址保存在R2R3中 MOV R2,A POP ACC MOV R3,A INC R0 INC R0 POP ACC ;将操作数弹出堆栈,传送到[R0]中 MOV @R0,A DEC R0 POP ACC MOV @R0,A DEC R0 POP ACC MOV @R0,A MOV A,R3 ;将返回地址压入堆栈 PUSH ACC MOV A,R2 PUSH ACC RET ;返回主程序 (11) 标号: FCMP 功能:浮点数代数值比较(不影响待比较操作数) 入口条件:待比较操作数分别在[R0]和[R1]中。 出口信息:若CY=1,则[R0] < [R1],若CY=0且A=0则 [R0] = [R1],否则[R0] > [R1]。 影响资源:A、B、PSW 堆栈需求: 2字节 FCMP: MOV A,@R0 ;数符比较 XRL A,@R1 JNB ACC.7,CMP2 MOV A,@R0 ;两数异号,以[R0]数符为准 RLC A MOV A,#0FFH RET CMP2: MOV A,@R1 ;两数同号,准备比较阶码 MOV C,ACC.6 MOV ACC.7,C MOV B,A MOV A,@R0 MOV C,ACC.7 MOV F0,C ;保存[R0]的数符 MOV C,ACC.6 MOV ACC.7,C CLR C ;比较阶码 SUBB A,B JZ CMP6 RLC A ;取阶码之差的符号 JNB F0,CMP5 CPL C ;[R0]为负时,结果取反 CMP5: MOV A,#0FFH ;两数不相等 RET CMP6: INC R0 ;阶码相同时,准备比较尾数 INC R0 INC R1 INC R1 CLR C MOV A,@R0 SUBB A,@R1 MOV B,A ;保存部分差 DEC R0 DEC R1 MOV A,@R0 SUBB A,@R1 DEC R0 DEC R1 ORL A,B ;生成是否相等信息 JZ CMP7 JNB F0,CMP7 CPL C ;[R0]为负时,结果取反 CMP7: RET (12) 标号: FABS 功能:浮点绝对值函数 入口条件:操作数在[R0]中。 出口信息:结果仍在[R0]中。 影响资源:A 堆栈需求: 2字节 FABS: MOV A,@R0 ;读取操作数的阶码 CLR ACC.7 ;清除数符 MOV @R0,A ;回传阶码 RET (13) 标号: FSGN 功能:浮点符号函数 入口条件:操作数在[R0]中。 出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零。 影响资源:PSW、A 堆栈需求: 2字节 FSGN: INC R0 ;读尾数 MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ SGN RET ;尾数为零,结束 SGN: MOV A,@R0 ;读取操作数的阶码 RLC A ;取数符 MOV A,#1 ;按正数初始化 JNC SGN1 ;是正数,结束 MOV A,#0FFH ;是负数,改变标志 SGN1: RET (14) 标号: FINT 功能:浮点取整函数 入口条件:操作数在[R0]中。 出口信息:结果仍在[R0]中。 影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节 FINT: LCALL MVR0 ;将[R0]传送到第一工作区中 LCALL INT ;在工作寄存器中完成取整运算 LJMP MOV0 ;将结果传回到[R0]中 INT: MOV A,R3 ORL A,R4 JNZ INTA CLR 1FH ;尾数为零,阶码也清零,结束取整 MOV R2,#41H RET INTA: MOV A,R2 JZ INTB ;阶码为零否? JB ACC.7,INTB;阶符为负否? CLR C SUBB A,#10H ;阶码小于16否? JC INTD RET ;阶码大于16,已经是整数 INTB: CLR A ;绝对值小于一,取整后正数为零,负数为负一 MOV R4,A MOV C,1FH RRC A MOV R3,A RL A MOV R2,A JNZ INTC MOV R2,#41H INTC: RET INTD: CLR F0 ;舍尾标志初始化 INTE: CLR C LCALL RR1 ;右规一次 ORL C,F0 ;记忆舍尾情况 MOV F0,C CJNE R2,#10H,INTE;阶码达到16(尾数完全为整数)否? JNB F0,INTF ;舍去部分为零否? JNB 1FH,INTF;操作数为正数否? INC R4 ;对于带小数的负数,向下取整 MOV A,R4 JNZ INTF INC R3 INTF: LJMP RLN ;将结果规格化 (15) 标号: FRCP 功能:浮点倒数函数 入口条件:操作数在[R0]中。 出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。 影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节 FRCP: MOV A,@R0 MOV C,ACC.7 MOV 1FH,C ;保存数符 MOV C,ACC.6 ;绝对值传送到第二工作区 MOV ACC.7,C MOV R5,A INC R0 MOV A,@R0 MOV R6,A INC R0 MOV A,@R0 MOV R7,A DEC R0 DEC R0 ORL A,R6 JNZ RCP SETB OV ;零不能求倒数,设立溢出标志 RET RCP: MOV A,R6 JB ACC.7,RCP2;操作数格式化否? CLR C ;格式化之 MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A DEC R5 SJMP RCP RCP2: MOV R2,#1 ;将数值1.00传送到第一工作区 MOV R3,#80H MOV R4,#0 LCALL DIV3 ;调用工作区浮点除法,求得倒数 LJMP MOV0 ;回传结果 (16) 标号: FSQU 功能:浮点数平方 入口条件:操作数在[R0]中。 出口信息:OV=0时,平方值仍然在[R0]中,OV=1时溢出。 影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 9字节 FSQU: MOV A,R0 ;将操作数 XCH A,R1 ;同时作为乘数 PUSH ACC ;保存R1指针 LCALL FMUL ;进行乘法运算 POP ACC MOV R1,A ;恢复R1指针 RET (待续) ※ 作 者: rcl 2000-7-25 13:19:10
|