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