|
(5) 標(biāo)號(hào): FDIV 功能:浮點(diǎn)數(shù)除法 入口條件:被除數(shù)在[R0]中,除數(shù)在[R1]中。 出口信息:OV=0時(shí),商仍在[R0]中,OV=1時(shí),溢出。 影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節(jié) FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H;被除數(shù)為零,不必運(yùn)算 CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 DEC R1 DEC R1 JNZ DIV2 SETB OV ;除數(shù)為零,溢出 RET DIV2: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中 MOV A,@R0 XRL A,@R1 ;比較兩個(gè)操作數(shù)的符號(hào) RLC A MOV 1FH,C ;保存結(jié)果的符號(hào) LCALL MVR1 ;將[R1]傳送到第二工作區(qū)中 LCALL DIV3 ;調(diào)用工作區(qū)浮點(diǎn)除法 LJMP MOV0 ;回傳結(jié)果 DIV3: CLR C ;比較尾數(shù)的大小 MOV A,R4 SUBB A,R7 MOV A,R3 SUBB A,R6 JC DIV4 LCALL RR1 ;被除數(shù)右規(guī)一次 SJMP DIV3 DIV4: CLR A ;借用R0R1R2作工作寄存器 XCH A,R0 ;清零并保護(hù)之 PUSH ACC CLR A XCH A,R1 PUSH ACC MOV A,R2 PUSH ACC MOV B,#10H ;除法運(yùn)算,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 ;將結(jié)果存回R3R4 MOV R4,A CLR A ADDC A,R0 MOV R3,A POP ACC ;恢復(fù)R0R1R2 MOV R2,A POP ACC MOV R1,A POP ACC MOV R0,A MOV A,R2 ;計(jì)算商的階碼 CLR C SUBB A,R5 LCALL MD ;階碼檢驗(yàn) LJMP RLN ;規(guī)格化 (6) 標(biāo)號(hào): FCLR 功能:浮點(diǎn)數(shù)清零 入口條件:操作數(shù)在[R0]中。 出口信息:操作數(shù)被清零。 影響資源:A 堆棧需求: 2字節(jié) FCLR: INC R0 INC R0 CLR A MOV @R0,A DEC R0 MOV @R0,A DEC R0 MOV @R0,#41H RET (7) 標(biāo)號(hào): FZER 功能:浮點(diǎn)數(shù)判零 入口條件:操作數(shù)在[R0]中。 出口信息:若累加器A為零,則操作數(shù)[R0]為零,否則不為零。 影響資源:A 堆棧需求: 2字節(jié) FZER: INC R0 INC R0 MOV A,@R0 DEC R0 ORL A,@R0 DEC R0 JNZ ZERO MOV @R0,#41H ZERO: RET (8) 標(biāo)號(hào): FMOV 功能:浮點(diǎn)數(shù)傳送 入口條件:源操作數(shù)在[R1]中,目標(biāo)地址為[R0]。 出口信息:[R0]=[R1],[R1]不變。 影響資源:A 堆棧需求: 2字節(jié) 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) 標(biāo)號(hào): FPUS 功能:浮點(diǎn)數(shù)壓棧 入口條件:操作數(shù)在[R0]中。 出口信息:操作數(shù)壓入棧頂。 影響資源:A、R2、R3 堆棧需求: 5字節(jié) FPUS: POP ACC ;將返回地址保存在R2R3中 MOV R2,A POP ACC MOV R3,A MOV A,@R0 ;將操作數(shù)壓入堆棧 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) 標(biāo)號(hào): FPOP 功能:浮點(diǎn)數(shù)出棧 入口條件:操作數(shù)處于棧頂。 出口信息:操作數(shù)彈至[R0]中。 影響資源:A、R2、R3 堆棧需求: 2字節(jié) FPOP: POP ACC ;將返回地址保存在R2R3中 MOV R2,A POP ACC MOV R3,A INC R0 INC R0 POP ACC ;將操作數(shù)彈出堆棧,傳送到[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) 標(biāo)號(hào): FCMP 功能:浮點(diǎn)數(shù)代數(shù)值比較(不影響待比較操作數(shù)) 入口條件:待比較操作數(shù)分別在[R0]和[R1]中。 出口信息:若CY=1,則[R0] < [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [R1]。 影響資源:A、B、PSW 堆棧需求: 2字節(jié) FCMP: MOV A,@R0 ;數(shù)符比較 XRL A,@R1 JNB ACC.7,CMP2 MOV A,@R0 ;兩數(shù)異號(hào),以[R0]數(shù)符為準(zhǔn) RLC A MOV A,#0FFH RET CMP2: MOV A,@R1 ;兩數(shù)同號(hào),準(zhǔn)備比較階碼 MOV C,ACC.6 MOV ACC.7,C MOV B,A MOV A,@R0 MOV C,ACC.7 MOV F0,C ;保存[R0]的數(shù)符 MOV C,ACC.6 MOV ACC.7,C CLR C ;比較階碼 SUBB A,B JZ CMP6 RLC A ;取階碼之差的符號(hào) JNB F0,CMP5 CPL C ;[R0]為負(fù)時(shí),結(jié)果取反 CMP5: MOV A,#0FFH ;兩數(shù)不相等 RET CMP6: INC R0 ;階碼相同時(shí),準(zhǔn)備比較尾數(shù) 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]為負(fù)時(shí),結(jié)果取反 CMP7: RET (12) 標(biāo)號(hào): FABS 功能:浮點(diǎn)絕對(duì)值函數(shù) 入口條件:操作數(shù)在[R0]中。 出口信息:結(jié)果仍在[R0]中。 影響資源:A 堆棧需求: 2字節(jié) FABS: MOV A,@R0 ;讀取操作數(shù)的階碼 CLR ACC.7 ;清除數(shù)符 MOV @R0,A ;回傳階碼 RET (13) 標(biāo)號(hào): FSGN 功能:浮點(diǎn)符號(hào)函數(shù) 入口條件:操作數(shù)在[R0]中。 出口信息:累加器 A=1 時(shí)為正數(shù),A=0FFH時(shí)為負(fù)數(shù),A=0 時(shí)為零。 影響資源:PSW、A 堆棧需求: 2字節(jié) FSGN: INC R0 ;讀尾數(shù) MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ SGN RET ;尾數(shù)為零,結(jié)束 SGN: MOV A,@R0 ;讀取操作數(shù)的階碼 RLC A ;取數(shù)符 MOV A,#1 ;按正數(shù)初始化 JNC SGN1 ;是正數(shù),結(jié)束 MOV A,#0FFH ;是負(fù)數(shù),改變標(biāo)志 SGN1: RET (14) 標(biāo)號(hào): FINT 功能:浮點(diǎn)取整函數(shù) 入口條件:操作數(shù)在[R0]中。 出口信息:結(jié)果仍在[R0]中。 影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節(jié) FINT: LCALL MVR0 ;將[R0]傳送到第一工作區(qū)中 LCALL INT ;在工作寄存器中完成取整運(yùn)算 LJMP MOV0 ;將結(jié)果傳回到[R0]中 INT: MOV A,R3 ORL A,R4 JNZ INTA CLR 1FH ;尾數(shù)為零,階碼也清零,結(jié)束取整 MOV R2,#41H RET INTA: MOV A,R2 JZ INTB ;階碼為零否? JB ACC.7,INTB;階符為負(fù)否? CLR C SUBB A,#10H ;階碼小于16否? JC INTD RET ;階碼大于16,已經(jīng)是整數(shù) INTB: CLR A ;絕對(duì)值小于一,取整后正數(shù)為零,負(fù)數(shù)為負(fù)一 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 ;舍尾標(biāo)志初始化 INTE: CLR C LCALL RR1 ;右規(guī)一次 ORL C,F0 ;記憶舍尾情況 MOV F0,C CJNE R2,#10H,INTE;階碼達(dá)到16(尾數(shù)完全為整數(shù))否? JNB F0,INTF ;舍去部分為零否? JNB 1FH,INTF;操作數(shù)為正數(shù)否? INC R4 ;對(duì)于帶小數(shù)的負(fù)數(shù),向下取整 MOV A,R4 JNZ INTF INC R3 INTF: LJMP RLN ;將結(jié)果規(guī)格化 (15) 標(biāo)號(hào): FRCP 功能:浮點(diǎn)倒數(shù)函數(shù) 入口條件:操作數(shù)在[R0]中。 出口信息:OV=0時(shí),結(jié)果仍在[R0]中,OV=1時(shí),溢出。 影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節(jié) FRCP: MOV A,@R0 MOV C,ACC.7 MOV 1FH,C ;保存數(shù)符 MOV C,ACC.6 ;絕對(duì)值傳送到第二工作區(qū) 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 ;零不能求倒數(shù),設(shè)立溢出標(biāo)志 RET RCP: MOV A,R6 JB ACC.7,RCP2;操作數(shù)格式化否? 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 ;將數(shù)值1.00傳送到第一工作區(qū) MOV R3,#80H MOV R4,#0 LCALL DIV3 ;調(diào)用工作區(qū)浮點(diǎn)除法,求得倒數(shù) LJMP MOV0 ;回傳結(jié)果 (16) 標(biāo)號(hào): FSQU 功能:浮點(diǎn)數(shù)平方 入口條件:操作數(shù)在[R0]中。 出口信息:OV=0時(shí),平方值仍然在[R0]中,OV=1時(shí)溢出。 影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 9字節(jié) FSQU: MOV A,R0 ;將操作數(shù) XCH A,R1 ;同時(shí)作為乘數(shù) PUSH ACC ;保存R1指針 LCALL FMUL ;進(jìn)行乘法運(yùn)算 POP ACC MOV R1,A ;恢復(fù)R1指針 RET |