?? mcs-51單片機實用子程序庫.htm
字號:
;第一操作數左規一次<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]
< [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [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 + -