|
(11) 標(biāo)號: DIVS 功能:雙字節(jié)二進(jìn)制有符號數(shù)除法(補(bǔ)碼) 入口條件:被除數(shù)在R2、R3、R4、R5中,除數(shù)在R6、R7中。 出口信息:OV=0時(shí)商在R2、R3中,OV=1時(shí)溢出。 影響資源:PSW、A、B、R1~R7 堆棧需求: 5字節(jié) DIVS: LCALL MDS ;計(jì)算結(jié)果的符號和兩個(gè)操作數(shù)的絕對值 PUSH PSW ;保存結(jié)果的符號 LCALL DIVD ;計(jì)算兩個(gè)絕對值的商 JNB OV,DVS1 ;溢出否? POP ACC ;溢出,放去結(jié)果的符號,保留溢出標(biāo)志 RET DVS1: POP PSW ;未溢出,取出結(jié)果的符號 MOV R4,#0 MOV R5,#0 MDSE: JB F0,MDS2 ;用補(bǔ)碼表示結(jié)果 CLR OV ;結(jié)果為正,原碼即補(bǔ)碼,計(jì)算成功 RET MDS: CLR F0 ;結(jié)果符號初始化 MOV A,R6 ;判斷第二操作數(shù)的符號 JNB ACC.7,MDS1;為正,不必處理 CPL F0 ;為負(fù),結(jié)果符號取反 XCH A,R7 ;第二操作數(shù)取補(bǔ),得到其絕對值 CPL A ADD A,#1 XCH A,R7 CPL A ADDC A,#0 MOV R6,A MDS1: MOV A,R2 ;判斷第一操作數(shù)或運(yùn)算結(jié)果的符號 JNB ACC.7,MDS3;為正,不必處理 CPL F0 ;為負(fù),結(jié)果符號取反 MDS2: MOV A,R5 ;求第一操作數(shù)的絕對值或運(yùn)算結(jié)果的補(bǔ)碼 CPL A ADD A,#1 MOV R5,A MOV A,R4 CPL A ADDC A,#0 MOV R4,A MOV A,R3 CPL A ADDC A,#0 MOV R3,A MOV A,R2 CPL A ADDC A,#0 MOV R2,A MDS3: CLR OV ;運(yùn)算成功 RET (12) 標(biāo)號: SH2 功能:雙字節(jié)二進(jìn)制無符號數(shù)開平方(快速) 入口條件:被開方數(shù)在R2、R3中。 出口信息:平方根仍在R2、R3中,整數(shù)部分的位數(shù)為原數(shù)的一半,其余為小數(shù)。 影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié) SH2: MOV A,R2 ORL A,R3 JNZ SH20 RET ;被開方數(shù)為零,不必運(yùn)算 SH20: MOV R7,#0 ;左規(guī)次數(shù)初始化 MOV A,R2 SH22: ANL A,#0C0H ;被開方數(shù)高字節(jié)小于40H否? JNZ SQRH ;不小于40H,左規(guī)格化完成,轉(zhuǎn)開方過程 CLR C ;每左規(guī)一次,被開方數(shù)左移兩位 MOV A,R3 RLC A MOV F0,C CLR C RLC A MOV R3,A MOV A,R2 MOV ACC.7,C MOV C,F0 RLC A RLC A MOV R2,A INC R7 ;左規(guī)次數(shù)加一 SJMP SH22 ;繼續(xù)左規(guī) (13) 標(biāo)號: SH4 功能:四字節(jié)二進(jìn)制無符號數(shù)開平方(快速) 入口條件:被開方數(shù)在R2、R3、R4、R5中。 出口信息:平方根在R2、R3中,整數(shù)部分的位數(shù)為原數(shù)的一半,其余為小數(shù)。 影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié) SH4: MOV A,R2 ORL A,R3 ORL A,R4 ORL A,R5 JNZ SH40 RET ;被開方數(shù)為零,不必運(yùn)算 SH40: MOV R7,#0 ;左規(guī)次數(shù)初始化 MOV A,R2 SH41: ANL A,#0C0H ;被開方數(shù)高字節(jié)小于40H否? JNZ SQRH ;不小于40H,左規(guī)格化完成 MOV R6,#2 ;每左規(guī)一次,被開方數(shù)左移兩位 SH42: CLR C ;被開方數(shù)左移一位 MOV A,R5 RLC A MOV R5,A MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A DJNZ R6,SH42 ;被開方數(shù)左移完兩位 INC R7 ;左規(guī)次數(shù)加一 SJMP SH41 ;繼續(xù)左規(guī) SQRH: MOV A,R2 ;規(guī)格化后高字節(jié)按折線法分為三個(gè)區(qū)間 ADD A,#57H JC SQR2 ADD A,#45H JC SQR1 ADD A,#24H MOV B,#0E3H ;第一區(qū)間的斜率 MOV R4,#80H ;第一區(qū)間的平方根基數(shù) SJMP SQR3 SQR1: MOV B,#0B2H ;第二區(qū)間的斜率 MOV R4,#0A0H;第二區(qū)間的平方根基數(shù) SJMP SQR3 SQR2: MOV B,#8DH ;第三區(qū)間的斜率 MOV R4,#0D0H;第三區(qū)間的平方根基數(shù) SQR3: MUL AB ;與區(qū)間基點(diǎn)的偏移量乘區(qū)間斜率 MOV A,B ADD A,R4 ;累加到平方根的基數(shù)上 MOV R4,A MOV B,A MUL AB ;求當(dāng)前平方根的冪 XCH A,R3 ;求偏移量(存放在R2R3中) CLR C SUBB A,R3 MOV R3,A MOV A,R2 SUBB A,B MOV R2,A SQR4: SETB C ;用減奇數(shù)法校正一個(gè)字節(jié)的平方根 MOV A,R4 ;當(dāng)前平方根的兩倍加一存入R5R6中 RLC A MOV R6,A CLR A RLC A MOV R5,A MOV A,R3 ;偏移量小于該奇數(shù)否? SUBB A,R6 MOV B,A MOV A,R2 SUBB A,R5 JC SQR5 ;小于,校正結(jié)束,已達(dá)到一個(gè)字節(jié)的精度 INC R4 ;不小于,平方根加一 MOV R2,A ;保存新的偏移量 MOV R3,B SJMP SQR4 ;繼續(xù)校正 SQR5: MOV A,R4 ;將一個(gè)字節(jié)精度的根存入R2 XCH A,R2 RRC A MOV F0,C ;保存最終偏移量的最高位 MOV A,R3 MOV R5,A ;將最終偏移量的低八位存入R5中 MOV R4,#8 ;通過(R5R6/R2)求根的低字節(jié) SQR6: CLR C MOV A,R3 RLC A MOV R3,A CLR C MOV A,R5 SUBB A,R2 JB F0,SQR7 JC SQR8 SQR7: MOV R5,A INC R3 SQR8: CLR C MOV A,R5 RLC A MOV R5,A MOV F0,C DJNZ R4,SQR6 ;根的第二字節(jié)計(jì)算完,在R3中 MOV A,R7 ;取原被開方數(shù)的左規(guī)次數(shù) JZ SQRE ;未左規(guī),開方結(jié)束 SQR9: CLR C ;按左規(guī)次數(shù)右移平方根,得到實(shí)際根 MOV A,R2 RRC A MOV R2,A MOV A,R3 RRC A MOV R3,A DJNZ R7,SQR9 SQRE: RET (14) 標(biāo)號: HASC 功能:單字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換成雙字節(jié)ASCII碼 入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù)在累加器A中。 出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。 影響資源:PSW、A、B 堆棧需求: 4字節(jié) HASC: MOV B,A ;暫存待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù) LCALL HAS1 ;轉(zhuǎn)換低四位 XCH A,B ;存放低四位的ASCII碼 SWAP A ;準(zhǔn)備轉(zhuǎn)換高四位 HAS1: ANL A,#0FH ;將累加器的低四位轉(zhuǎn)換成ASCII碼 ADD A,#90H DA A ADDC A,#40H DA A RET (15) 標(biāo)號: ASCH 功能:ASCII碼轉(zhuǎn)換成十六進(jìn)制數(shù) 入口條件:待轉(zhuǎn)換的ASCII碼(30H~39H或41H~46H)在A中。 出口信息:轉(zhuǎn)換后的十六進(jìn)制數(shù)(00H~0FH)仍在累加器A中。 影響資源:PSW、A 堆棧需求: 2字節(jié) ASCH: CLR C SUBB A,#30H JNB ACC.4,ASH1 SUBB A,#7 ASH1: RET (16) 標(biāo)號:HBCD 功能:單字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成單字節(jié)BCD碼整數(shù) 入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制整數(shù)在累加器A中。 出口信息:轉(zhuǎn)換后的BCD碼整數(shù)(十位和個(gè)位)仍在累加器A中,百位在R3中。 影響資源:PSW、A、B、R3 堆棧需求: 2字節(jié) HBCD: MOV B,#100 ;分離出百位,存放在R3中 DIV AB MOV R3,A MOV A,#10 ;余數(shù)繼續(xù)分離十位和個(gè)位 XCH A,B DIV AB SWAP A ORL A,B ;將十位和個(gè)位拼裝成BCD碼 RET (17) 標(biāo)號: HB2 功能:雙字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù) 入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在R6、R7中。 出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。 影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié) HB2: CLR A ;BCD碼初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù) HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 ;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2 ADDC A,R5 DA A ;十進(jìn)制調(diào)整 MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ;雙字節(jié)十六進(jìn)制數(shù)的萬位數(shù)不超過6,不用調(diào)整 DJNZ R2,HB3 ;處理完16bit RET (18) 標(biāo)號: HBD 功能:單字節(jié)十六進(jìn)制小數(shù)轉(zhuǎn)換成單字節(jié)BCD碼小數(shù) 入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制小數(shù)在累加器A中。 出口信息:CY=0時(shí)轉(zhuǎn)換后的BCD碼小數(shù)仍在A中。CY=1時(shí)原小數(shù)接近整數(shù)1。 影響資源:PSW、A、B 堆棧需求: 2字節(jié) HBD: MOV B,#100 ;原小數(shù)擴(kuò)大一百倍 MUL AB RLC A ;余數(shù)部分四舍五入 CLR A ADDC A,B MOV B,#10 ;分離出十分位和百分位 DIV AB SWAP A ADD A,B ;拼裝成單字節(jié)BCD碼小數(shù) DA A ;調(diào)整后若有進(jìn)位,原小數(shù)接近整數(shù)1 RET (19) 標(biāo)號: HBD2 功能:雙字節(jié)十六進(jìn)制小數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼小數(shù) 入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制小數(shù)在R2、R3中。 出口信息:轉(zhuǎn)換后的雙字節(jié)BCD碼小數(shù)仍在R2、R3中。 影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節(jié) HBD2: MOV R4,#4 ;四位十進(jìn)制碼 HBD3: MOV A,R3 ;原小數(shù)擴(kuò)大十倍 MOV B,#10 MUL AB MOV R3,A MOV R5,B MOV A,R2 MOV B,#10 MUL AB ADD A,R5 MOV R2,A CLR A ADDC A,B PUSH ACC ;保存溢出的一位十進(jìn)制碼 DJNZ R4,HBD3 ;計(jì)算完四位十進(jìn)制碼 POP ACC ;取出萬分位 MOV R3,A POP ACC ;取出千分位 SWAP A ORL A,R3 ;拼裝成低字節(jié)BCD碼小數(shù) MOV R3,A POP ACC ;取出百分位 MOV R2,A POP ACC ;取出十分位 SWAP A ORL A,R2 ;拼裝成高字節(jié)BCD碼小數(shù) MOV R2,A RET (20)標(biāo)號:BCDH 功能:單字節(jié)BCD碼整數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制整數(shù) 入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼整數(shù)在累加器A中。 出口信息:轉(zhuǎn)換后的單字節(jié)十六進(jìn)制整數(shù)仍在累加器A中。 影響資源:PSW、A、B、R4 堆棧需求: 2字節(jié) BCDH: MOV B,#10H ;分離十位和個(gè)位 DIV AB MOV R4,B ;暫存?zhèn)位 MOV B,#10 ;將十位轉(zhuǎn)換成十六進(jìn)制 MUL AB ADD A,R4 ;按十六進(jìn)制加上個(gè)位 RET (21)標(biāo)號: BH2 功能:雙字節(jié)BCD碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進(jìn)制整數(shù) 入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼整數(shù)在R2、R3中。 出口信息:轉(zhuǎn)換后的雙字節(jié)十六進(jìn)制整數(shù)仍在R2、R3中。 影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節(jié) BH2: MOV A,R3 ;將低字節(jié)轉(zhuǎn)換成十六進(jìn)制 LCALL BCDH MOV R3,A MOV A,R2 ;將高字節(jié)轉(zhuǎn)換成十六進(jìn)制 LCALL BCDH MOV B,#100 ;擴(kuò)大一百倍 MUL AB ADD A,R3 ;和低字節(jié)按十六進(jìn)制相加 MOV R3,A CLR A ADDC A,B MOV R2,A RET (22)標(biāo)號: BHD 功能:單字節(jié)BCD碼小數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制小數(shù) 入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼數(shù)在累加器A中。 出口信息:轉(zhuǎn)換后的單字節(jié)十六進(jìn)制小數(shù)仍在累加器A中。 影響資源:PSW、A、R2、R3 堆棧需求: 2字節(jié) BHD: MOV R2,#8 ;準(zhǔn)備計(jì)算一個(gè)字節(jié)小數(shù) BHD0: ADD A,ACC ;按十進(jìn)制倍增 DA A XCH A,R3 RLC A ;將進(jìn)位標(biāo)志移入結(jié)果中 XCH A,R3 DJNZ R2,BHD0 ;共計(jì)算8bit小數(shù) ADD A,#0B0H ;剩余部分達(dá)到0.50否? JNC BHD1 ;四舍 INC R3 ;五入 BHD1: MOV A,R3 ;取結(jié)果 RET |