




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
26/2651定點(diǎn)運(yùn)算子程序庫及其使用說明
定點(diǎn)運(yùn)算子程序庫文件名為DQ51.ASM,為便于使用,先將有關(guān)約定說明如下:
1.多字節(jié)定點(diǎn)操作數(shù):用[R0]或[R1]來表示存放在由R0或R1指示的連續(xù)單元中的數(shù)?據(jù).地址小的單元存放數(shù)據(jù)的高字節(jié)。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,?(31H)=34H,(32H)=56H。
2.運(yùn)算精度:單次定點(diǎn)運(yùn)算精度為結(jié)果最低位的當(dāng)量值。?3.工作區(qū):數(shù)據(jù)工作區(qū)固定在PSW、A、B、R2~R7,用戶只要不在工作區(qū)中存放無?關(guān)的或非消耗性的信息,程序就具有較好的透明性。?(1)標(biāo)號(hào):BCDA功能:多字節(jié)BCD碼加法
入口條件:字節(jié)數(shù)在R7中,被加數(shù)在[R0]中,加數(shù)在[R1]中.
出口信息:和在[R0]中,最高位進(jìn)位在CY中。
影響資源:PSW、A、R2堆棧需求:2字節(jié)
BCDA:MOVA,R7;取字節(jié)數(shù)至R2中
MOVR2,A
ADDA,R0;初始化數(shù)據(jù)指針
MOVR0,A?MOVA,R2?ADDA,R1?MOVR1,A?CLRC
BCD1:DECR0;調(diào)整數(shù)據(jù)指針
DECR1?MOVA,@R0?ADDCA,@R1;按字節(jié)相加?DAA;十進(jìn)制調(diào)整?MOV@R0,A;和存回[R0]中
DJNZR2,BCD1;處理完所有字節(jié)?RET?(2)標(biāo)號(hào):BCDB功能:多字節(jié)BCD碼減法
入口條件:字節(jié)數(shù)在R7中,被減數(shù)在[R0]中,減數(shù)在[R1]中。?出口信息:差在[R0]中,最高位借位在CY中。?影響資源:PSW、A、R2、R3堆棧需求:6字節(jié)
BCDB:LCALLNEG1;減數(shù)[R1]十進(jìn)制取補(bǔ)
LCALLBCDA;按多字節(jié)BCD碼加法處理?CPLC;將補(bǔ)碼加法的進(jìn)位標(biāo)志轉(zhuǎn)換成借位標(biāo)志?MOVF0,C;保護(hù)借位標(biāo)志?LCALLNEG1;恢復(fù)減數(shù)[R1]的原始值
MOVC,F0;恢復(fù)借位標(biāo)志?RET
NEG1:MOVA,R0;[R1]十進(jìn)制取補(bǔ)子程序入口?XCHA,R1;交換指針
XCHA,R0
LCALLNEG;通過[R0]實(shí)現(xiàn)[R1]取補(bǔ)?MOVA,R0?XCHA,R1;換回指針
XCHA,R0
RET???(3)標(biāo)號(hào):NEG功能:多字節(jié)BCD碼取補(bǔ)??入口條件:字節(jié)數(shù)在R7中,操作數(shù)在[R0]中。
出口信息:結(jié)果仍在[R0]中。
影響資源:PSW、A、R2、R3堆棧需求:2字節(jié)?NEG:MOVA,R7;取(字節(jié)數(shù)減一)至R2中
DECA?MOVR2,A?MOVA,R0;保護(hù)指針?MOVR3,A?NEG0:CLRC
MOVA,#99H?SUBBA,@R0;按字節(jié)十進(jìn)制取補(bǔ)
MOV@R0,A;存回[R0]中?INCR0;調(diào)整數(shù)據(jù)指針
DJNZR2,NEG0;處理完(R2)字節(jié)
MOVA,#9AH;最低字節(jié)單獨(dú)取補(bǔ)
SUBBA,@R0?MOV@R0,A?MOVA,R3;恢復(fù)指針?MOVR0,A
RET?(4)標(biāo)號(hào):BRLN功能:多字節(jié)BCD碼左移十進(jìn)制一位(乘十)
入口條件:字節(jié)數(shù)在R7中,操作數(shù)在[R0]中.?出口信息:結(jié)果仍在[R0]中,移出的十進(jìn)制最高位在R3中。
影響資源:PSW、A、R2、R3堆棧需求:2字節(jié)?BRLN:MOVA,R7;取字節(jié)數(shù)至R2中?MOVR2,A
ADDA,R0;初始化數(shù)據(jù)指針?MOVR0,A?MOVR3,#0;工作單元初始化?BRL1:DECR0;調(diào)整數(shù)據(jù)指針?MOVA,@R0;取一字節(jié)
SWAPA;交換十進(jìn)制高低位?MOV@R0,A;存回?MOVA,R3;取低字節(jié)移出的十進(jìn)制高位?XCHDA,@R0;換出本字節(jié)的十進(jìn)制高位?MOVR3,A;保存本字節(jié)的十進(jìn)制高位
DJNZR2,BRL1;處理完所有字節(jié)
RET
(5)標(biāo)號(hào):MULD功能:雙字節(jié)二進(jìn)制無符號(hào)數(shù)乘法
入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。?出口信息:乘積在R2、R3、R4、R5中。?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)?MULD:MOVA,R3;計(jì)算R3乘R7
MOVB,R7?MULAB
MOVR4,B;暫存部分積
MOVR5,A?MOVA,R3;計(jì)算R3乘R6
MOVB,R6
MULAB
ADDA,R4;累加部分積?MOVR4,A
CLRA?ADDCA,B?MOVR3,A
MOVA,R2;計(jì)算R2乘R7?MOVB,R7
MULAB?ADDA,R4;累加部分積
MOVR4,A
MOVA,R3
ADDCA,B?MOVR3,A?CLRA
RLCA?XCHA,R2;計(jì)算R2乘R6?MOVB,R6
MULAB
ADDA,R3;累加部分積?MOVR3,A
MOVA,R2
ADDCA,B
MOVR2,A
RET?(6)標(biāo)號(hào):MUL2功能:雙字節(jié)二進(jìn)制無符號(hào)數(shù)平方?入口條件:待平方數(shù)在R2、R3中。
出口信息:結(jié)果在R2、R3、R4、R5中。?影響資源:PSW、A、B、R2~R5堆棧需求:2字節(jié)
MUL2:MOVA,R3;計(jì)算R3平方
MOVB,A?MULAB
MOVR4,B;暫存部分積
MOVR5,A?MOVA,R2;計(jì)算R2平方
MOVB,A
MULAB
XCHA,R3;暫存部分積,并換出R2和R3?XCHA,B
XCHA,R2?MULAB;計(jì)算2×R2×R3
CLRC?RLCA?XCHA,B?RLCA
JNCMU20
INCR2;累加溢出量
MU20:XCHA,B;累加部分積?ADDA,R4
MOVR4,A
MOVA,R3?ADDCA,B
MOVR3,A?CLRA?ADDCA,R2?MOVR2,A
RET?(7)標(biāo)號(hào):DIVD功能:雙字節(jié)二進(jìn)制無符號(hào)數(shù)除法
入口條件:被除數(shù)在R2、R3、R4、R5中,除數(shù)在R6、R7中。
出口信息:OV=0時(shí),雙字節(jié)商在R2、R3中,OV=1時(shí)溢出。
影響資源:PSW、A、B、R1~R7堆棧需求:2字節(jié)
DIVD:CLRC;比較被除數(shù)和除數(shù)?MOVA,R3
SUBBA,R7?MOVA,R2?SUBBA,R6
JCDVD1?SETBOV;溢出
RET
DVD1:MOVB,#10H;計(jì)算雙字節(jié)商?DVD2:CLRC;部分商和余數(shù)同時(shí)左移一位
MOVA,R5
RLCA
MOVR5,A
MOVA,R4?RLCA
MOVR4,A
MOVA,R3?RLCA
MOVR3,A
XCHA,R2?RLCA?XCHA,R2?MOVF0,C;保存溢出位?CLRC
SUBBA,R7;計(jì)算(R2R3—R6R7)
MOVR1,A?MOVA,R2?SUBBA,R6
ANLC,/F0;結(jié)果判斷
JCDVD3?MOVR2,A;夠減,存放新的余數(shù)
MOVA,R1
MOVR3,A?INCR5;商的低位置一
DVD3:DJNZB,DVD2;計(jì)算完十六位商(R4R5)?MOVA,R4;將商移到R2R3中
MOVR2,A?MOVA,R5?MOVR3,A
CLROV;設(shè)立成功標(biāo)志
RET?(8)標(biāo)號(hào):D457功能:雙字節(jié)二進(jìn)制無符號(hào)數(shù)除以單字節(jié)二進(jìn)制數(shù)?入口條件:被除數(shù)在R4、R5中,除數(shù)在R7中。
出口信息:OV=0時(shí),單字節(jié)商在R3中,OV=1時(shí)溢出。?影響資源:PSW、A、R3~R7堆棧需求:2字節(jié)?D457:CLRC
MOVA,R4?SUBBA,R7?JCDV50?SETBOV;商溢出
RET?DV50:MOVR6,#8;求平均值(R4R5/R7-→R3)
DV51:MOVA,R5
RLCA
MOVR5,A?MOVA,R4
RLCA
MOVR4,A
MOVF0,C?CLRC?SUBBA,R7
ANLC,/F0
JCDV52?MOVR4,A
DV52:CPLC?MOVA,R3
RLCA?MOVR3,A?DJNZR6,DV51
MOVA,R4;四舍五入?ADDA,R4?JCDV53
SUBBA,R7?JCDV54
DV53:INCR3
DV54:CLROV?RET?(9)標(biāo)號(hào):DV31功能:三字節(jié)二進(jìn)制無符號(hào)數(shù)除以單字節(jié)二進(jìn)制數(shù)?入口條件:被除數(shù)在R3、R4、R5中,除數(shù)在R7中。
出口信息:OV=0時(shí),雙字節(jié)商在R4、R5中,OV=1時(shí)溢出。?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)
DV31:CLRC
MOVA,R3
SUBBA,R7?JCDV30?SETBOV;商溢出?RET?DV30:MOVR2,#10H;求R3R4R5/R7—→R4R5?DM23:CLRC?MOVA,R5?RLCA?MOVR5,A?MOVA,R4
RLCA
MOVR4,A
MOVA,R3?RLCA
MOVR3,A?MOVF0,C?CLRC
SUBBA,R7
ANLC,/F0
JCDM24
MOVR3,A?INCR5
DM24:DJNZR2,DM23
MOVA,R3;四舍五入?ADDA,R3
JCDM25
SUBBA,R7
JCDM26
DM25:INCR5
MOVA,R5
JNZDM26?INCR4?DM26:CLROV
RET;商在R4R5中
(10)標(biāo)號(hào):MULS功能:雙字節(jié)二進(jìn)制有符號(hào)數(shù)乘法(補(bǔ)碼)?
入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。
出口信息:乘積在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R7堆棧需求:4字節(jié)?
MULS:MOVR4,#0;清零R4R5?MOVR5,#0?LCALLMDS;計(jì)算結(jié)果的符號(hào)和兩個(gè)操作數(shù)的絕對(duì)值?LCALLMULD;計(jì)算兩個(gè)絕對(duì)值的乘積?SJMPMDSE;用補(bǔ)碼表示結(jié)果
(11)標(biāo)號(hào):DIVS功能:雙字節(jié)二進(jìn)制有符號(hào)數(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:LCALLMDS;計(jì)算結(jié)果的符號(hào)和兩個(gè)操作數(shù)的絕對(duì)值?PUSHPSW;保存結(jié)果的符號(hào)?LCALLDIVD;計(jì)算兩個(gè)絕對(duì)值的商?JNBOV,DVS1;溢出否??POPACC;溢出,放去結(jié)果的符號(hào),保留溢出標(biāo)志?RET
DVS1:POPPSW;未溢出,取出結(jié)果的符號(hào)?MOVR4,#0
MOVR5,#0
MDSE:JBF0,MDS2;用補(bǔ)碼表示結(jié)果?CLROV;結(jié)果為正,原碼即補(bǔ)碼,計(jì)算成功?RET?MDS:CLRF0;結(jié)果符號(hào)初始化
MOVA,R6;判斷第二操作數(shù)的符號(hào)?JNBACC。7,MDS1;為正,不必處理?CPLF0;為負(fù),結(jié)果符號(hào)取反?XCHA,R7;第二操作數(shù)取補(bǔ),得到其絕對(duì)值?CPLA?ADDA,#1
XCHA,R7
CPLA?ADDCA,#0?MOVR6,A?MDS1:MOVA,R2;判斷第一操作數(shù)或運(yùn)算結(jié)果的符號(hào)?JNBACC。7,MDS3;為正,不必處理?CPLF0;為負(fù),結(jié)果符號(hào)取反
MDS2:MOVA,R5;求第一操作數(shù)的絕對(duì)值或運(yùn)算結(jié)果的補(bǔ)碼?CPLA
ADDA,#1
MOVR5,A
MOVA,R4?CPLA
ADDCA,#0?MOVR4,A
MOVA,R3
CPLA?ADDCA,#0?MOVR3,A?MOVA,R2
CPLA?ADDCA,#0?MOVR2,A
MDS3:CLROV;運(yùn)算成功
RET
(12)標(biāo)號(hào):SH2功能:雙字節(jié)二進(jìn)制無符號(hào)數(shù)開平方(快速)?入口條件:被開方數(shù)在R2、R3中。
出口信息:平方根仍在R2、R3中,整數(shù)部分的位數(shù)為原數(shù)的一半,其余為小數(shù).?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)
SH2:MOVA,R2?ORLA,R3?JNZSH20
RET;被開方數(shù)為零,不必運(yùn)算?SH20:MOVR7,#0;左規(guī)次數(shù)初始化?MOVA,R2
SH22:ANLA,#0C0H;被開方數(shù)高字節(jié)小于40H否?
JNZSQRH;不小于40H,左規(guī)格化完成,轉(zhuǎn)開方過程
CLRC;每左規(guī)一次,被開方數(shù)左移兩位
MOVA,R3
RLCA?MOVF0,C
CLRC
RLCA?MOVR3,A?MOVA,R2
MOVACC.7,C?MOVC,F(xiàn)0
RLCA?RLCA
MOVR2,A
INCR7;左規(guī)次數(shù)加一?SJMPSH22;繼續(xù)左規(guī)?(13)標(biāo)號(hào):SH4功能:四字節(jié)二進(jìn)制無符號(hào)數(shù)開平方(快速)?入口條件:被開方數(shù)在R2、R3、R4、R5中.?出口信息:平方根在R2、R3中,整數(shù)部分的位數(shù)為原數(shù)的一半,其余為小數(shù)。?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)?SH4:MOVA,R2
ORLA,R3?ORLA,R4?ORLA,R5
JNZSH40
RET;被開方數(shù)為零,不必運(yùn)算?SH40:MOVR7,#0;左規(guī)次數(shù)初始化
MOVA,R2
SH41:ANLA,#0C0H;被開方數(shù)高字節(jié)小于40H否?
JNZSQRH;不小于40H,左規(guī)格化完成?MOVR6,#2;每左規(guī)一次,被開方數(shù)左移兩位?SH42:CLRC;被開方數(shù)左移一位?MOVA,R5?RLCA
MOVR5,A
MOVA,R4?RLCA
MOVR4,A
MOVA,R3
RLCA?MOVR3,A?MOVA,R2?RLCA?MOVR2,A
DJNZR6,SH42;被開方數(shù)左移完兩位
INCR7;左規(guī)次數(shù)加一?SJMPSH41;繼續(xù)左規(guī)?SQRH:MOVA,R2;規(guī)格化后高字節(jié)按折線法分為三個(gè)區(qū)間
ADDA,#57H?JCSQR2
ADDA,#45H
JCSQR1
ADDA,#24H
MOVB,#0E3H;第一區(qū)間的斜率
MOVR4,#80H;第一區(qū)間的平方根基數(shù)
SJMPSQR3?SQR1:MOVB,#0B2H;第二區(qū)間的斜率?MOVR4,#0A0H;第二區(qū)間的平方根基數(shù)
SJMPSQR3?SQR2:MOVB,#8DH;第三區(qū)間的斜率
MOVR4,#0D0H;第三區(qū)間的平方根基數(shù)?SQR3:MULAB;與區(qū)間基點(diǎn)的偏移量乘區(qū)間斜率?MOVA,B?ADDA,R4;累加到平方根的基數(shù)上?MOVR4,A?MOVB,A
MULAB;求當(dāng)前平方根的冪
XCHA,R3;求偏移量(存放在R2R3中)?CLRC?SUBBA,R3
MOVR3,A
MOVA,R2?SUBBA,B?MOVR2,A?SQR4:SETBC;用減奇數(shù)法校正一個(gè)字節(jié)的平方根?MOVA,R4;當(dāng)前平方根的兩倍加一存入R5R6中?RLCA?MOVR6,A?CLRA?RLCA?MOVR5,A?MOVA,R3;偏移量小于該奇數(shù)否??SUBBA,R6?MOVB,A
MOVA,R2
SUBBA,R5?JCSQR5;小于,校正結(jié)束,已達(dá)到一個(gè)字節(jié)的精度?INCR4;不小于,平方根加一
MOVR2,A;保存新的偏移量
MOVR3,B?SJMPSQR4;繼續(xù)校正?SQR5:MOVA,R4;將一個(gè)字節(jié)精度的根存入R2?XCHA,R2?RRCA
MOVF0,C;保存最終偏移量的最高位?MOVA,R3
MOVR5,A;將最終偏移量的低八位存入R5中?MOVR4,#8;通過(R5R6/R2)求根的低字節(jié)?SQR6:CLRC?MOVA,R3?RLCA?MOVR3,A?CLRC?MOVA,R5
SUBBA,R2
JBF0,SQR7
JCSQR8?SQR7:MOVR5,A?INCR3
SQR8:CLRC?MOVA,R5
RLCA?MOVR5,A
MOVF0,C?DJNZR4,SQR6;根的第二字節(jié)計(jì)算完,在R3中?MOVA,R7;取原被開方數(shù)的左規(guī)次數(shù)
JZSQRE;未左規(guī),開方結(jié)束?SQR9:CLRC;按左規(guī)次數(shù)右移平方根,得到實(shí)際根
MOVA,R2
RRCA
MOVR2,A
MOVA,R3?RRCA?MOVR3,A?DJNZR7,SQR9?SQRE:RET?(14)標(biāo)號(hà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:MOVB,A;暫存待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù)?LCALLHAS1;轉(zhuǎn)換低四位
XCHA,B;存放低四位的ASCII碼?SWAPA;準(zhǔn)備轉(zhuǎn)換高四位
HAS1:ANLA,#0FH;將累加器的低四位轉(zhuǎn)換成ASCII碼
ADDA,#90H?DAA?ADDCA,#40H?DAA?RET?(15)標(biāo)號(hà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:CLRC
SUBBA,#30H
JNBACC。4,ASH1?SUBBA,#7
ASH1:RET?(16)標(biāo)號(hà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:MOVB,#100;分離出百位,存放在R3中
DIVAB
MOVR3,A
MOVA,#10;余數(shù)繼續(xù)分離十位和個(gè)位
XCHA,B
DIVAB?SWAPA
ORLA,B;將十位和個(gè)位拼裝成BCD碼
RET
(17)標(biāo)號(hà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:CLRA;BCD碼初始化
MOVR3,A
MOVR4,A?MOVR5,A
MOVR2,#10H;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù)
HB3:MOVA,R7;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中?RLCA
MOVR7,A
MOVA,R6?RLCA?MOVR6,A?MOVA,R5;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2
ADDCA,R5
DAA;十進(jìn)制調(diào)整?MOVR5,A
MOVA,R4?ADDCA,R4?DAA?MOVR4,A?MOVA,R3?ADDCA,R3
MOVR3,A;雙字節(jié)十六進(jìn)制數(shù)的萬位數(shù)不超過6,不用調(diào)整?DJNZR2,HB3;處理完16bit?RET
(18)標(biāo)號(hà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:MOVB,#100;原小數(shù)擴(kuò)大一百倍
MULAB?RLCA;余數(shù)部分四舍五入?CLRA
ADDCA,B
MOVB,#10;分離出十分位和百分位?DIVAB?SWAPA
ADDA,B;拼裝成單字節(jié)BCD碼小數(shù)?DAA;調(diào)整后若有進(jìn)位,原小數(shù)接近整數(shù)1
RET
(19)標(biāo)號(hà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:MOVR4,#4;四位十進(jìn)制碼?HBD3:MOVA,R3;原小數(shù)擴(kuò)大十倍?MOVB,#10
MULAB?MOVR3,A?MOVR5,B?MOVA,R2
MOVB,#10
MULAB?ADDA,R5
MOVR2,A?CLRA?ADDCA,B
PUSHACC;保存溢出的一位十進(jìn)制碼?DJNZR4,HBD3;計(jì)算完四位十進(jìn)制碼?POPACC;取出萬分位
MOVR3,A?POPACC;取出千分位?SWAPA
ORLA,R3;拼裝成低字節(jié)BCD碼小數(shù)
MOVR3,A
POPACC;取出百分位?MOVR2,A?POPACC;取出十分位
SWAPA?ORLA,R2;拼裝成高字節(jié)BCD碼小數(shù)
MOVR2,A?RET
(20)標(biāo)號(hà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:MOVB,#10H;分離十位和個(gè)位
DIVAB?MOVR4,B;暫存?zhèn)€位?MOVB,#10;將十位轉(zhuǎn)換成十六進(jìn)制
MULAB
ADDA,R4;按十六進(jìn)制加上個(gè)位?RET?(21)標(biāo)號(hà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:MOVA,R3;將低字節(jié)轉(zhuǎn)換成十六進(jìn)制?LCALLBCDH
MOVR3,A
MOVA,R2;將高字節(jié)轉(zhuǎn)換成十六進(jìn)制?LCALLBCDH?MOVB,#100;擴(kuò)大一百倍?MULAB
ADDA,R3;和低字節(jié)按十六進(jìn)制相加
MOVR3,A?CLRA
ADDCA,B?MOVR2,A?RET?(22)標(biāo)號(hà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:MOVR2,#8;準(zhǔn)備計(jì)算一個(gè)字節(jié)小數(shù)?BHD0:ADDA,ACC;按十進(jìn)制倍增?DAA
XCHA,R3
RLCA;將進(jìn)位標(biāo)志移入結(jié)果中?XCHA,R3
DJNZR2,BHD0;共計(jì)算8bit小數(shù)
ADDA,#0B0H;剩余部分達(dá)到0.50否?
JNCBHD1;四舍?INCR3;五入
BHD1:MOVA,R3;取結(jié)果
RET
(23)標(biāo)號(hào):BHD2功能:雙字節(jié)BCD碼小數(shù)轉(zhuǎn)換成雙字節(jié)十六進(jìn)制小數(shù)
入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼小數(shù)在R4、R5中。?出口信息:轉(zhuǎn)換后的雙字節(jié)十六進(jìn)制小數(shù)在R2、R3中。*
影響資源:PSW、A、R2~R6堆棧需求:2字節(jié)?BHD2:MOVR6,#10H;準(zhǔn)備計(jì)算兩個(gè)字節(jié)小數(shù)
BHD3:MOVA,R5;按十進(jìn)制倍增?ADDA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A?MOVA,R3;將進(jìn)位標(biāo)志移入結(jié)果中?RLCA?MOVR3,A?MOVA,R2?RLCA?MOVR2,A?DJNZR6,BHD3;共計(jì)算16bit小數(shù)
MOVA,R4?ADDA,#0B0H;剩余部分達(dá)到0.50否??JNCBHD4;四舍
INCR3;五入
MOVA,R3
JNZBHD4
INCR2?BHD4:RET
(24)標(biāo)號(hào):MM功能:求單字節(jié)十六進(jìn)制無符號(hào)數(shù)據(jù)塊的極值?入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中.?影響資源:PSW、A、B、R1~R7堆棧需求:4字節(jié)
MM:MOVB,R7;保存數(shù)據(jù)個(gè)數(shù)
MOVXA,@DPTR;讀取第一個(gè)數(shù)據(jù)
MOVR6,A;作為最大值的初始值
MOVR7,A;也作為最小值的初始值
MOVA,DPL;取第一個(gè)數(shù)據(jù)的地址
MOVR3,A;作為最大值存放地址的初始值
MOVR5,A;也作為最小值存放地址的初始值?MOVA,DPH
MOVR2,A?MOVR4,A
MOVA,B;取數(shù)據(jù)個(gè)數(shù)
DECA;減一,得到需要比較的次數(shù)?JZMME;只有一個(gè)數(shù)據(jù),不需要比較
MOVR1,A;保存比較次數(shù)?PUSHDPL;保護(hù)數(shù)據(jù)塊的首址
PUSHDPH?MM1:INCDPTR;指向一個(gè)新的數(shù)據(jù)?MOVXA,@DPTR;讀取這個(gè)數(shù)據(jù)?MOVB,A;保存?SETBC;與最大值比較?SUBBA,R6?JCMM2;不超過當(dāng)前最大值,保持當(dāng)前最大值?MOVR6,B;超過當(dāng)前最大值,更新最大值存放地址?MOVR2,DPH;同時(shí)更新最大值存放地址
MOVR3,DPL
SJMPMM3?MM2:MOVA,B;與最小值比較?CLRC?SUBBA,R7?JNCMM3;大于或等于當(dāng)前最小值,保持當(dāng)前最小值?MOVR7,B;更新最小值?MOVR4,DPH;更新最小值存放地址
MOVR5,DPL?MM3:DJNZR1,MM1;處理完全部數(shù)據(jù)
POPDPH;恢復(fù)數(shù)據(jù)首址?POPDPL?MME:RET?(25)標(biāo)號(hào):MMS功能:求單字節(jié)十六進(jìn)制有符號(hào)數(shù)據(jù)塊的極值?入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中.?出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7堆棧需求:4字節(jié)?MMS:MOVB,R7;保存數(shù)據(jù)個(gè)數(shù)?MOVXA,@DPTR;讀取第一個(gè)數(shù)據(jù)?MOVR6,A;作為最大值的初始值
MOVR7,A;也作為最小值的初始值
MOVA,DPL;取第一個(gè)數(shù)據(jù)的地址
MOVR3,A;作為最大值存放地址的初始值
MOVR5,A;也作為最小值存放地址的初始值
MOVA,DPH
MOVR2,A
MOVR4,A?MOVA,B;取數(shù)據(jù)個(gè)數(shù)?DECA;減一,得到需要比較的次數(shù)
JZMMSE;只有一個(gè)數(shù)據(jù),不需要比較
MOVR1,A;保存比較次數(shù)
PUSHDPL;保護(hù)數(shù)據(jù)塊的首址?PUSHDPH
MMS1:INCDPTR;調(diào)整數(shù)據(jù)指針?MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)
MOVB,A;保存
SETBC;與最大值比較
SUBBA,R6
JZMMS4;相同,不更新最大值?JNBOV,MMS2;差未溢出,符號(hào)位有效
CPLACC。7;差溢出,符號(hào)位取反?MMS2:JBACC。7,MMS4;差為負(fù),不更新最大值?MOVR6,B;更新最大值
MOVR2,DPH;更新最大值存放地址
MOVR3,DPL
SJMPMMS7?MMS4:MOVA,B;與最小值比較
CLRC
SUBBA,R7?JNBOV,MMS6;差未溢出,符號(hào)位有效?CPLACC.7;差溢出,符號(hào)位取反
MMS6:JNBACC.7,MMS7;差為正,不更新最小值?MOVR7,B;更新最小值
MOVR4,DPH;更新最小值存放地址
MOVR5,DPL?MMS7:DJNZR1,MMS1;處理完全部數(shù)據(jù)?POPDPH;恢復(fù)數(shù)據(jù)首址?POPDPL?MMSE:RET?(26)標(biāo)號(hào):FDS1功能:順序查找(ROM)單字節(jié)表格?入口條件:待查找的內(nèi)容在A中,表格首址在DPTR中,表格的字節(jié)數(shù)在R7中.?出口信息:OV=0時(shí),順序號(hào)在累加器A中;OV=1時(shí),未找到。?影響資源:PSW、A、B、R2、R6堆棧需求:2字節(jié)
FDS1:MOVB,A;保存待查找的內(nèi)容
MOVR2,#0;順序號(hào)初始化(指向表首)
MOVA,R7;保存表格的長度
MOVR6,A
FD11:MOVA,R2;按順序號(hào)讀取表格內(nèi)容
MOVCA,@A+DPTR?CJNEA,B,F(xiàn)D12;與待查找的內(nèi)容比較
CLROV;相同,查找成功
MOVA,R2;取對(duì)應(yīng)的順序號(hào)
RET?FD12:INCR2;指向表格中的下一個(gè)內(nèi)容
DJNZR6,F(xiàn)D11;查完全部表格內(nèi)容?SETBOV;未查找到,失敗?RET
(27)標(biāo)號(hào):FDS2功能:順序查找(ROM)雙字節(jié)表格
入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)總個(gè)數(shù)在R7中。?出口信息:OV=0時(shí)順序號(hào)在累加器A中,地址在DPTR中;OV=1時(shí)未找到.?影響資源:PSW、A、R2、R6、DPTR堆棧需求:2字節(jié)??FDS2:MOVA,R7;保存表格中數(shù)據(jù)的個(gè)數(shù)
MOVR6,A?MOVR2,#0;順序號(hào)初始化(指向表首)
FD21:CLRA;讀取表格內(nèi)容的高字節(jié)?MOVCA,@A+DPTR
XRLA,R4;與待查找內(nèi)容的高字節(jié)比較?JNZFD22
MOVA,#1;讀取表格內(nèi)容的低字節(jié)
MOVCA,@A+DPTR?XRLA,R5;與待查找內(nèi)容的低字節(jié)比較?JNZFD22?CLROV;相同,查找成功
MOVA,R2;取對(duì)應(yīng)的順序號(hào)?RET?FD22:INCDPTR;指向下一個(gè)數(shù)據(jù)
INCDPTR?INCR2;順序號(hào)加一?DJNZR6,FD21;查完全部數(shù)據(jù)
SETBOV;未查找到,失敗
RET
(28)標(biāo)號(hào):FDD1功能:對(duì)分查找(ROM)單字節(jié)無符號(hào)增序數(shù)據(jù)表格
入口條件:待查找的內(nèi)容在累加器A中,表格首址在DPTR中,字節(jié)數(shù)在R7中.?出口信息:OV=0時(shí),順序號(hào)在累加器A中;OV=1時(shí),未找到。?影響資源:PSW、A、B、R2、R3、R4堆棧需求:2字節(jié)?FDD1:MOVB,A;保存待查找的內(nèi)容
MOVR2,#0;區(qū)間低端指針初始化(指向第一個(gè)數(shù)據(jù))
MOVA,R7
DECA?MOVR3,A;區(qū)間高端指針初始化(指向最后一個(gè)數(shù)據(jù))
FD61:CLRC;判斷區(qū)間大小
MOVA,R3?SUBBA,R2
JCFD69;區(qū)間消失,查找失敗
RRCA;取區(qū)間大小的一半
ADDA,R2;加上區(qū)間的低端?MOVR4,A;得到區(qū)間的中心
MOVCA,@A+DPTR;讀取該點(diǎn)的內(nèi)容
CJNEA,B,FD65;與待查找的內(nèi)容比較?CLROV;相同,查找成功?MOVA,R4;取順序號(hào)?RET?FD65:JCFD68;該點(diǎn)的內(nèi)容比待查找的內(nèi)容大否??MOVA,R4;偏大,取該點(diǎn)位置
DECA;減一
MOVR3,A;作為新的區(qū)間高端?SJMPFD61;繼續(xù)查找?FD68:MOVA,R4;偏小,取該點(diǎn)位置
INCA;加一
MOVR2,A;作為新的區(qū)間低端
SJMPFD61;繼續(xù)查找?FD69:SETBOV;查找失敗
RET
(29)標(biāo)號(hào):FDD2功能:對(duì)分查找(ROM)雙字節(jié)無符號(hào)增序數(shù)據(jù)表格?入口條件:查找內(nèi)容在R4、R5中,表格首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。?出口信息:OV=0時(shí)順序號(hào)在累加器A中,址在DPTR中;OV=1時(shí)未找到。
影響資源:PSW、A、B、R1~R7、DPTR堆棧需求:2字節(jié)??FDD2:MOVR2,#0;區(qū)間低端指針初始化(指向第一個(gè)數(shù)據(jù))?MOVA,R7
DECA
MOVR3,A;區(qū)間高端指針初始化,指向最后一個(gè)數(shù)據(jù)
MOVR6,DPH;保存表格首址?MOVR7,DPL?FD81:CLRC;判斷區(qū)間大小
MOVA,R3?SUBBA,R2?JCFD89;區(qū)間消失,查找失敗?RRCA;取區(qū)間大小的一半?ADDA,R2;加上區(qū)間的低端?MOVR1,A;得到區(qū)間的中心?MOVDPH,R6?CLRC;計(jì)算區(qū)間中心的地址?RLCA?JNCFD82
INCDPH?FD82:ADDA,R7?MOVDPL,A
JNCFD83
INCDPH?FD83:CLRA;讀取該點(diǎn)的內(nèi)容的高字節(jié)
MOVCA,@A+DPTR?MOVB,R4;與待查找內(nèi)容的高字節(jié)比較?CJNEA,B,F(xiàn)D84;不相同?MOVA,#1;讀取該點(diǎn)的內(nèi)容的低字節(jié)
MOVCA,@A+DPTR?MOVB,R5?CJNEA,B,F(xiàn)D84;與待查找內(nèi)容的低字節(jié)比較?MOVA,R1;取順序號(hào)?CLROV;查找成功
RET
FD84:JCFD86;該點(diǎn)的內(nèi)容比待查找的內(nèi)容大否??MOVA,R1;偏大,取該點(diǎn)位置
DECA;減一?MOVR3,A;作為新的區(qū)間高端
SJMPFD81;繼續(xù)查找?FD86:MOVA,R1;偏小,取該點(diǎn)位置
INCA;加一
MOVR2,A;作為新的區(qū)間低端
SJMPFD81;繼續(xù)查找
FD89:MOVDPH,R6;相同,恢復(fù)首址
MOVDPL,R7
SETBOV;查找失敗?RET
(30)標(biāo)號(hào):DDM1功能:求單字節(jié)十六進(jìn)制無符號(hào)數(shù)據(jù)塊的平均值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
出口信息:平均值在累加器A中。?影響資源:PSW、A、R2~R6堆棧需求:4字節(jié)
DDM1:MOVA,R7;保存數(shù)據(jù)個(gè)數(shù)?MOVR2,A
PUSHDPH?PUSHDPL?CLRA;初始化累加和?MOVR4,A?MOVR5,A
DM11:MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)
ADDA,R5;累加到累加和中
MOVR5,A
JNCDM12?INCR4?DM12:INCDPTR;調(diào)整指針
DJNZR2,DM11;累加完全部數(shù)據(jù)?LCALLD457;求平均值(R4R5/R7-→R3)
MOVA,R3;取平均值
POPDPL?POPDPH
RET?(31)標(biāo)號(hào):DDM2功能:求雙字節(jié)十六進(jìn)制無符號(hào)數(shù)據(jù)塊的平均值
入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個(gè)數(shù)在R7中。
出口信息:平均值在R4、R5中。?影響資源:PSW、A、R2~R6堆棧需求:4字節(jié)?
DDM2:MOVA,R7;保存數(shù)據(jù)個(gè)數(shù)
MOVR2,A;初始化數(shù)據(jù)指針
PUSHDPL;保持首址
PUSHDPH
CLRA;初始化累加和
MOVR3,A
MOVR4,A?MOVR5,A?DM20:MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)的高字節(jié)?MOVB,A
INCDPTR
MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)的低字節(jié)?INCDPTR
ADDA,R5;累加到累加和中?MOVR5,A?MOVA,B?ADDCA,R4
MOVR4,A
JNCDM21
INCR3
DM21:DJNZR2,DM20;累加完全部數(shù)據(jù)?POPDPH;恢復(fù)首址?POPDPL?LJMPDV31;求R3R4R5/R7-→R4R5,得到平均值
(32)標(biāo)號(hào):XR1功能:求單字節(jié)數(shù)據(jù)塊的(異或)校驗(yàn)和
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)的個(gè)數(shù)在R6、R7中。
出口信息:校驗(yàn)和在累加器A中.?影響資源:PSW、A、B、R4~R7堆棧需求:2字節(jié)?XR1:MOVR4,DPH;保存數(shù)據(jù)塊的首址
MOVR5,DPL?MOVA,R7;雙字節(jié)計(jì)數(shù)器調(diào)整
JZXR10?INCR6
XR10:MOVB,#0;校驗(yàn)和初始化
XR11:MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)
XRLB,A;異或運(yùn)算
INCDPTR;指向下一個(gè)數(shù)據(jù)?DJNZR7,XR11;雙字節(jié)計(jì)數(shù)器減一?DJNZR6,XR11
MOVDPH,R4;恢復(fù)數(shù)據(jù)首址
MOVDPL,R5
MOVA,B;取校驗(yàn)和
RET?(33)標(biāo)號(hào):XR2功能:求雙字節(jié)數(shù)據(jù)塊的(異或)校驗(yàn)和
入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個(gè)數(shù)在R6、R7中。?出口信息:校驗(yàn)和在R2、R3中。?影響資源:PSW、A、R2~R7堆棧需求:2字節(jié)
XR2:MOVR4,DPH;保存數(shù)據(jù)塊的首址?MOVR5,DPL
MOVA,R7;雙字節(jié)計(jì)數(shù)器調(diào)整
JZXR20?INCR6?XR20:CLRA;校驗(yàn)和初始化
MOVR2,A?MOVR3,A?XR21:MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)的高字節(jié)
XRLA,R2;異或運(yùn)算?MOVR2,A
INCDPTR
MOVXA,@DPTR;讀取一個(gè)數(shù)據(jù)的低字節(jié)?XRLA,R3;異或運(yùn)算?MOVR3,A?INCDPTR;指向下一個(gè)數(shù)據(jù)?DJNZR7,XR21;雙字節(jié)計(jì)數(shù)器減一?DJNZR6,XR21
MOVDPH,R4;恢復(fù)數(shù)據(jù)首址
MOVDPL,R5?RET?(34)標(biāo)號(hào):SORT功能:單字節(jié)無符號(hào)數(shù)據(jù)塊排序(增序)
入口條件:數(shù)據(jù)塊的首址在R0中,字節(jié)數(shù)在R7中。
出口信息:完成排序(增序)
影響資源:PSW、A、R2~R6堆棧需求:2字節(jié)?SORT:MOVA,R7
MOVR5,A;比較次數(shù)初始化
SRT1:CLRF0;交換標(biāo)志初始化
MOVA,R5;取上遍比較次數(shù)
DECA;本遍比上遍減少一次
MOVR5,A;保存本遍次數(shù)?MOVR2,A;復(fù)制到計(jì)數(shù)器中?JZSRT5;若為零,排序結(jié)束?MOVA,R0;保存數(shù)據(jù)指針
MOVR6,A?SRT2:MOVA,@R0;讀取一個(gè)數(shù)據(jù)?MOVR3,A
INCR0;指向下一個(gè)數(shù)據(jù)
MOVA,@R0;再讀取一個(gè)數(shù)據(jù)
MOVR4,A
CLRC?SUBBA,R3;比較兩個(gè)數(shù)據(jù)的大小?JNCSRT4;順序正確(增序或相同),不必交換
SETBF0;設(shè)立交換標(biāo)志?MOVA,R3;將兩個(gè)數(shù)據(jù)交換位置?MOV@R0,A
DECR0?MOVA,R4?MOV@R0,A?INCR0;指向下一個(gè)數(shù)據(jù)
SRT4:DJNZR2,SRT2;完成本遍的比較次數(shù)
MOVA,R6;恢復(fù)數(shù)據(jù)首址?MOVR0,A
JBF0,SRT1;本遍若進(jìn)行過交換,則需繼續(xù)排序?SRT5:RET;排序結(jié)束
END(二)51浮點(diǎn)運(yùn)算子程序庫及其使用說明
?本浮點(diǎn)子程序庫有三個(gè)不同層次的版本,以便適應(yīng)不同的應(yīng)用場(chǎng)合:
1。小型庫(FQ51A.ASM):只包含浮點(diǎn)加、減、乘、除子程序。
2.中型庫(FQ51B。ASM):在小型庫的基礎(chǔ)上再增加絕對(duì)值、倒數(shù)、比較、平方、開平方、
?數(shù)制轉(zhuǎn)換等子程序。
3.大型庫(FQ51。ASM):包含本說明書中的全部子程序。
為便于讀者使用本程序庫,先將有關(guān)約定說明如下:
1.雙字節(jié)定點(diǎn)操作數(shù):用[R0]或[R1]來表示存放在由R0或R1指示的連續(xù)單元中的數(shù)
?據(jù),地址小的單元存放高字節(jié)。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H.
?2.二進(jìn)制浮點(diǎn)操作數(shù):用三個(gè)字節(jié)表示,第一個(gè)字節(jié)的最高位為數(shù)符,其余七位為
?階碼(補(bǔ)碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié)
?純小數(shù)(原碼)來表示。當(dāng)尾數(shù)的最高位為1時(shí),便稱為規(guī)格化浮點(diǎn)數(shù),簡稱操作數(shù)。在
?程序說明中,也用[R0]或[R1]來表示R0或R1指示的浮點(diǎn)操作數(shù),例如:當(dāng)[R0]=-6.000時(shí),
則二進(jìn)制浮點(diǎn)數(shù)表示為83C000H.若(R0)=30H,則(30H)=83H,(31H)=0C0H,(32H)=00H。
?3.十進(jìn)制浮點(diǎn)操作數(shù):用三個(gè)字節(jié)表示,第一個(gè)字節(jié)的最高位為數(shù)符,其余七位為
階碼(二進(jìn)制補(bǔ)碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用
雙字節(jié)BCD碼純小數(shù)(原碼)來表示。當(dāng)十進(jìn)制數(shù)的絕對(duì)值大于1時(shí),階碼就等于整數(shù)
部分的位數(shù),如876.5的階碼是03H,—876.5的階碼是83H;當(dāng)十進(jìn)制數(shù)的絕對(duì)值小于1
?時(shí),階碼就等于80H減去小數(shù)點(diǎn)后面零的個(gè)數(shù),例如0.00382的階碼是7EH,-0。00382
?的階碼是0FEH。在程序說明中,用[R0]或[R1]來表示R0或R1指示的十進(jìn)制浮點(diǎn)操作數(shù)。例
?如有一個(gè)十進(jìn)制浮點(diǎn)操作數(shù)存放在30H、31H、32H中,數(shù)值是-0。07315,即—0.7315乘以10
的-1次方,則(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]來指向它,則應(yīng)使(R0)=30H。
4.運(yùn)算精度:單次定點(diǎn)運(yùn)算精度為結(jié)果最低位的當(dāng)量值;單次二進(jìn)制浮點(diǎn)算術(shù)運(yùn)算
的精度優(yōu)于十萬分之三;單次二進(jìn)制浮點(diǎn)超越函數(shù)運(yùn)算的精度優(yōu)于萬分之一;BCD碼浮
點(diǎn)數(shù)本身的精度比較低(萬分之一到千分之一),不宜作為運(yùn)算的操作數(shù),僅用于輸入或
輸出時(shí)的數(shù)制轉(zhuǎn)換。不管那種數(shù)據(jù)格式,隨著連續(xù)運(yùn)算的次數(shù)增加,精度都會(huì)下降。
?5.工作區(qū):數(shù)據(jù)工作區(qū)固定在A、B、R2~R7,數(shù)符或標(biāo)志工作區(qū)固定在PSW和23H單
?元(位1CH~1FH)。在浮點(diǎn)系統(tǒng)中,R2、R3、R4和位1FH為第一工作區(qū),R5、R6、R7和位1EH
為第二工作區(qū)。用戶只要不在工作區(qū)中存放無關(guān)的或非消耗性的信息,程序就具有較好的
透明性。
6。子程序調(diào)用范例:由于本程序庫特別注意了各子程序接口的相容性,很容易采用
?積木方式(或流水線方式)完成一個(gè)公式的計(jì)算.以浮點(diǎn)運(yùn)算為例:
?計(jì)算y=Ln√|Sin(ab/c+d)|
?已知:a=-123.4;b=0。7577;c=56.34;d=1.276;它們分別存放在30H、33H、36H、
?39H開始的連續(xù)三個(gè)單元中。用BCD碼浮點(diǎn)數(shù)表示時(shí),分別為a=831234H;b=007577H;
?c=025634H;d=011276H。
?求解過程:通過調(diào)用BTO(shè)F子程序,將各變量轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù),再進(jìn)行各
種運(yùn)算,最后調(diào)用FTOB子程序,還原成十進(jìn)制形式,供輸出使用。程序如下:
TEST:MOVR0,#39H;指向BCD碼浮點(diǎn)操作數(shù)d
?LCALLBTO(shè)F;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
?MOVR0,#36H;指向BCD碼浮點(diǎn)操作數(shù)c
?LCALLBTOF;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
MOVR0,#33H;指向BCD碼浮點(diǎn)操作數(shù)b
?LCALLBTOF;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
MOVR0,#30H;指向BCD碼浮點(diǎn)操作數(shù)a
LCALLBTO(shè)F;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù)
?MOVR1,#33H;指向二進(jìn)制浮點(diǎn)操作數(shù)b
?LCALLFMUL;進(jìn)行浮點(diǎn)乘法運(yùn)算
?MOVR1,#36H;指向二進(jìn)制浮點(diǎn)操作數(shù)c
LCALLFDIV;進(jìn)行浮點(diǎn)除法運(yùn)算
?MOVR1,#39H;指向二進(jìn)制浮點(diǎn)操作數(shù)d
LCALLFADD;進(jìn)行浮點(diǎn)加法運(yùn)算
?LCALLFSIN;進(jìn)行浮點(diǎn)正弦運(yùn)算
?LCALLFABS;進(jìn)行浮點(diǎn)絕對(duì)值運(yùn)算
?LCALLFSQR;進(jìn)行浮點(diǎn)開平方運(yùn)算
LCALLFLN(yùn);進(jìn)行浮點(diǎn)對(duì)數(shù)運(yùn)算
?LCALLFTOB;將結(jié)果轉(zhuǎn)換成BCD碼浮點(diǎn)數(shù)
?STOP:LJMPSTO(shè)P
?END
運(yùn)行結(jié)果,[R0]=804915H,即y=—0。4915,比較精確的結(jié)果應(yīng)該是-0。491437。
?(1)標(biāo)號(hào):FSDT功能:浮點(diǎn)數(shù)格式化
?入口條件:待格式化浮點(diǎn)操作數(shù)在[R0]中。
出口信息:已格式化浮點(diǎn)操作數(shù)仍在[R0]中。
?影響資源:PSW、A、R2、R3、R4、位1FH堆棧需求:6字節(jié)
FSDT:LCALLMVR0;將待格式化操作數(shù)傳送到第一工作區(qū)中
LCALLRLN(yùn);通過左規(guī)完成格式化
?LJMPMOV0;將已格式化浮點(diǎn)操作數(shù)傳回到[R0]中
(2)標(biāo)號(hào):FADD功能:浮點(diǎn)數(shù)加法
入口條件:被加數(shù)在[R0]中,加數(shù)在[R1]中.
出口信息:OV=0時(shí),和仍在[R0]中,OV=1時(shí),溢出.
?影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:6字節(jié)
?FADD:CLRF0;設(shè)立加法標(biāo)志
SJMPAS;計(jì)算代數(shù)和
?(3)標(biāo)號(hào):FSUB功能:浮點(diǎn)數(shù)減法
入口條件:被減數(shù)在[R0]中,減數(shù)在[R1]中。
出口信息:OV=0時(shí),差仍在[R0]中,OV=1時(shí),溢出。
?影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:6字節(jié)
?FSUB:SETBF0;設(shè)立減法標(biāo)志
AS:LCALLMVR1;計(jì)算代數(shù)和。先將[R1]傳送到第二工作區(qū)
MOVC,F0;用加減標(biāo)志來校正第二操作數(shù)的有效符號(hào)
?RRCA
?XRLA,@R1
?MOVC,ACC.7
?ASN:MOV1EH,C;將第二操作數(shù)的有效符號(hào)存入位1EH中
XRLA,@R0;與第一操作數(shù)的符號(hào)比較
RLCA
?MOVF0,C;保存比較結(jié)果
?LCALLMVR0;將[R0]傳送到第一工作區(qū)中
LCALLAS1;在工作寄存器中完成代數(shù)運(yùn)算
MOV0:INCR0;將結(jié)果傳回到[R0]中的子程序入口
INCR0
?MOVA,R4;傳回尾數(shù)的低字節(jié)
?MOV@R0,A
DECR0
?MOVA,R3;傳回尾數(shù)的高字節(jié)
MOV@R0,A
DECR0
?MOVA,R2;取結(jié)果的階碼
?MOVC,1FH;取結(jié)果的數(shù)符
?MOVACC.7,C;拼入階碼中
MOV@R0,A
?CLRACC.7;不考慮數(shù)符
CLROV;清除溢出標(biāo)志
?CJNEA,#3FH,MV01;階碼是否上溢?
SETBOV;設(shè)立溢出標(biāo)志
MV01:MOVA,@R0;取出帶數(shù)符的階碼
RET
MVR0:MOVA,@R0;將[R0]傳送到第一工作區(qū)中的子程序
MOVC,ACC。7;將數(shù)符保存在位1FH中
?MOV1FH,C
MOVC,ACC.6;將階碼擴(kuò)充為8bit補(bǔ)碼
MOVACC.7,C
?MOVR2,A;存放在R2中
INCR0
?MOVA,@R0;將尾數(shù)高字節(jié)存放在R3中
?MOVR3,A
INCR0
?MOVA,@R0;將尾數(shù)低字節(jié)存放在R4中
MOVR4,A
DECR0;恢復(fù)數(shù)據(jù)指針
DECR0
RET
?MVR1:MOVA,@R1;將[R1]傳送到第二工作區(qū)中的子程序
?MOVC,ACC.7;將數(shù)符保存在位1EH中
?MOV1EH,C
MOVC,ACC.6;將階碼擴(kuò)充為8bit補(bǔ)碼
MOVACC。7,C
MOVR5,A;存放在R5中
INCR1
?MOVA,@R1;將尾數(shù)高字節(jié)存放在R6中
MOVR6,A
?INCR1
MOVA,@R1;將尾數(shù)低字節(jié)存放在R7中
MOVR7,A
DECR1;恢復(fù)數(shù)據(jù)指針
?DECR1
?RET
AS1:MOVA,R6;讀取第二操作數(shù)尾數(shù)高字節(jié)
?ORLA,R7
JZAS2;第二操作數(shù)為零,不必運(yùn)算
MOVA,R3;讀取第一操作數(shù)尾數(shù)高字節(jié)
ORLA,R4
?JNZEQ1
?MOVA,R6;第一操作數(shù)為零,結(jié)果以第二操作數(shù)為準(zhǔn)
?MOVR3,A
MOVA,R7
MOVR4,A
?MOVA,R5
?MOVR2,A
MOVC,1EH
MOV1FH,C
AS2:RET
?EQ1:MOVA,R2;對(duì)階,比較兩個(gè)操作數(shù)的階碼
?XRLA,R5
?JZAS4;階碼相同,對(duì)階結(jié)束
?JBACC.7,EQ3;階符互異
?MOVA,R2;階符相同,比較大小
?CLRC
?SUBBA,R5
JCEQ4
EQ2:CLRC;第二操作數(shù)右規(guī)一次
?MOVA,R6;尾數(shù)縮小一半
RRCA
MOVR6,A
?MOVA,R7
RRCA
?MOVR7,A
INCR5;階碼加一
ORLA,R6;尾數(shù)為零否?
?JNZEQ1;尾數(shù)不為零,繼續(xù)對(duì)階
MOVA,R2;尾數(shù)為零,提前結(jié)束對(duì)階
MOVR5,A
SJMPAS4
EQ3:MOVA,R2;判斷第一操作數(shù)階符
JNBACC。7,EQ2;如為正,右規(guī)第二操作數(shù)
EQ4:CLRC
LCALLRR1;第一操作數(shù)右規(guī)一次
?ORLA,R3;尾數(shù)為零否?
?JNZEQ1;不為零,繼續(xù)對(duì)階
?MOVA,R5;尾數(shù)為零,提前結(jié)束對(duì)階
?MOVR2,A
?AS4:JBF0,AS5;尾數(shù)加減判斷
?MOVA,R4;尾數(shù)相加
?ADDA,R7
MOVR4,A
?MOVA,R3
?ADDCA,R6
?MOVR3,A
JNCAS2
LJMPRR1;有進(jìn)位,右規(guī)一次
AS5:CLRC;比較絕對(duì)值大小
?MOVA,R4
?SUBBA,R7
?MOVB,A
?MOVA,R3
SUBBA,R6
JCAS6
?MOVR4,B;第一尾數(shù)減第二尾數(shù)
?MOVR3,A
LJMPRLN;結(jié)果規(guī)格化
AS6:CPL1FH;結(jié)果的符號(hào)與第一操作數(shù)相反
?CLRC;結(jié)果的絕對(duì)值為第二尾數(shù)減第一尾數(shù)
MOVA,R7
?SUBBA,R4
?MOVR4,A
MOVA,R6
?SUBBA,R3
?MOVR3,A
RLN:MOVA,R3;浮點(diǎn)數(shù)規(guī)格化
ORLA,R4;尾數(shù)為零否?
?JNZRLN1
?MOVR2,#0C1H;階碼取最小值
RET
?RLN1:MOVA,R3
?JBACC。7,RLN2;尾數(shù)最高位為一否?
CLRC;不為一,左規(guī)一次
?LCALLRL1
?SJMPRLN;繼續(xù)判斷
?RLN2:CLROV;規(guī)格化結(jié)束
?RET
RL1:MOVA,R4;第一操作數(shù)左規(guī)一次
RLCA;尾數(shù)擴(kuò)大一倍
MOVR4,A
?MOVA,R3
?RLCA
?MOVR3,A
?DECR2;階碼減一
CJNER2,#0C0H,RL1E;階碼下溢否?
CLRA
?MOVR3,A;階碼下溢,操作數(shù)以零計(jì)
?MOVR4,A
MOVR2,#0C1H
?RL1E:CLROV
?RET
RR1:MOVA,R3;第一操作數(shù)右規(guī)一次
?RRCA;尾數(shù)縮小一半
?MOVR3,A
MOVA,R4
?RRCA
MOVR4,A
INCR2;階碼加一
?CLROV;清溢出標(biāo)志
CJNER2,#40H,RR1E;階碼上溢否?
MOVR2,#3FH;階碼溢出
?SETBOV
?RR1E:RET
(4)標(biāo)號(hào):FMUL功能:浮點(diǎn)數(shù)乘法
?入口條件:被乘數(shù)在[R0]中,乘數(shù)在[R1]中.
出口信息:OV=0時(shí),積仍在[R0]中,OV=1時(shí),溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:6字節(jié)
?FMUL:LCALLMVR0;將[R0]傳送到第一工作區(qū)中
?MOVA,@R0
XRLA,@R1;比較兩個(gè)操作數(shù)的符號(hào)
?RLCA
?MOV1FH,C;保存積的符號(hào)
LCALLMUL0;計(jì)算積的絕對(duì)值
?LJMPMOV0;將結(jié)果傳回到[R0]中
MUL0:LCALLMVR1;將[R1]傳送到第二工作區(qū)中
MUL1:MOVA,R3;第一尾數(shù)為零否?
?ORLA,R4
JZMUL6
?MOVA,R6;第二尾數(shù)為零否?
?ORLA,R7
JZMUL5
MOVA,R7;計(jì)算R3R4×R6R7-→R3R4
MOVB,R4
?MULAB
MOVA,B
XCHA,R7
?MOVB,R3
?MULAB
ADDA,R7
MOVR7,A
CLRA
ADDCA,B
XCHA,R4
MOVB,R6
MULAB
?ADDA,R7
?MOVR7,A
?MOVA,B
?ADDCA,R4
MOVR4,A
CLRA
RLCA
?XCHA,R3
?MOVB,R6
?MULAB
ADDA,R4
?MOVR4,A
MOVA,B
?ADDCA,R3
?MOVR3,A
JBACC.7,MUL2;積為規(guī)格化數(shù)否?
MOVA,R7;左規(guī)一次
RLCA
?MOVR7,A
?LCALLRL1
MUL2:MOVA,R7
?JNBACC.7,MUL3
INCR4
MOVA,R4
JNZMUL3
INCR3
?MOVA,R3
JNZMUL3
?MOVR3,#80H
INCR2
MUL3:MOVA,R2;求積的階碼
ADDA,R5
?MD:MOVR2,A;階碼溢出判斷
JBACC。7,MUL4
JNBACC。6,MUL6
MOVR2,#3FH;階碼上溢,設(shè)立標(biāo)志
SETBOV
?RET
MUL4:JBACC.6,MUL6
?MUL5:CLRA;結(jié)果清零(因子為零或階碼下溢)
?MOVR3,A
?MOVR4,A
?MOVR2,#41H
MUL6:CLROV
?RET
(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:INCR0
MOVA,@R0
INCR0
ORLA,@R0
?DECR0
?DECR0
JNZDIV1
MOV@R0,#41H;被除數(shù)為零,不必運(yùn)算
?CLROV
?RET
DIV1:INCR1
?MOVA,@R1
INCR1
ORLA,@R1
?DECR1
?DECR1
JNZDIV2
?SETBOV;除數(shù)為零,溢出
?RET
DIV2:LCALLMVR0;將[R0]傳送到第一工作區(qū)中
?MOVA,@R0
?XRLA,@R1;比較兩個(gè)操作數(shù)的符號(hào)
?RLCA
?MOV1FH,C;保存結(jié)果的符號(hào)
LCALLMVR1;將[R1]傳送到第二工作區(qū)中
LCALLDIV3;調(diào)用工作區(qū)浮點(diǎn)除法
?LJMPMOV0;回傳結(jié)果
DIV3:CLRC;比較尾數(shù)的大小
?MOVA,R4
SUBBA,R7
?MOVA,R3
?SUBBA,R6
?JCDIV4
?LCALLRR1;被除數(shù)右規(guī)一次
?SJMPDIV3
DIV4:CLRA;借用R0R1R2作工作寄存器
?XCHA,R0;清零并保護(hù)之
PUSHACC
?CLRA
XCHA,R1
PUSHACC
?MOVA,R2
?PUSHACC
?MOVB,#10H;除法運(yùn)算,R3R4/R6R7—→R0R1
?DIV5:CLRC
MOVA,R1
?RLCA
MOVR1,A
MOVA,R0
RLCA
MOVR0,A
MOVA,R4
?RLCA
?MOVR4,A
XCHA,R3
?RLCA
XCHA,R3
MOVF0,C
?CLRC
SUBBA,R7
?MOVR2,A
?MOVA,R3
SUBBA,R6
ANLC,/F0
JCDIV6
MOVR3,A
?MOVA,R2
MOVR4,A
INCR1
DIV6:DJNZB,DIV5
?MOVA,R6;四舍五入
CLRC
RRCA
?SUBBA,R3
?CLRA
ADDCA,R1;將結(jié)果存回R3R4
?MOVR4,A
?CLRA
?ADDCA,R0
MOVR3,A
?POPACC;恢復(fù)R0R1R2
MOVR2,A
?POPACC
MOVR1,A
?POPACC
MOVR0,A
?MOVA,R2;計(jì)算商的階碼
?CLRC
?SUBBA,R5
LCALLMD;階碼檢驗(yàn)
?LJMPRLN(yùn);規(guī)格化
?(6)標(biāo)號(hào):FCLR功能:浮點(diǎn)數(shù)清零
入口條件:操作數(shù)在[R0]中。
?出口信息:操作數(shù)被清零。
?影響資源:A堆棧需求:2字節(jié)
FCLR:INCR0
?INCR0
CLRA
MOV@R0,A
DECR0
MOV@R0,A
DECR0
?MOV@R0,#41H
?RET
(7)標(biāo)號(hào):FZER功能:浮點(diǎn)數(shù)判零
?
入口條件:操作數(shù)在[R0]中。
?出口信息:若累加器A為零,則操作數(shù)[R0]為零,否則不為零。
?影響資源:A堆棧需求:2字節(jié)
?FZER:INCR0
INCR0
?MOVA,@R0
DECR0
ORLA,@R0
?DECR0
JNZZERO
?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:INCR0
?INCR0
INCR1
INCR1
?MOVA,@R1
?MOV@R0,A
DECR0
?DECR1
?MOVA,@R1
MOV@R0,A
?DECR0
DECR1
MOVA,@R1
MOV@R0,A
RET
(9)標(biāo)號(hào):FPUS功能:浮點(diǎn)數(shù)壓棧
入口條件:操作數(shù)在[R0]中。
出口信息:操作數(shù)壓入棧頂。
影響資源:A、R2、R3堆棧需求:5字節(jié)
?FPUS:POPACC;將返回地址保存在R2R3中
MOVR2,A
?POPACC
?MOVR3,A
MOVA,@R0;將操作數(shù)壓入堆棧
PUSHACC
INCR0
MOVA,@R0
?PUSHACC
INCR0
?MOVA,@R0
PUSHACC
DECR0
DECR0
MOVA,R3;將返回地址壓入堆棧
PUSHACC
MOVA,R2
?PUSHACC
?RET;返回主程序
?(10)標(biāo)號(hào):FPOP功能:浮點(diǎn)數(shù)出棧
入口條件:操作數(shù)處于棧頂。
?出口信息:操作數(shù)彈至[R0]中。
影響資源:A、R2、R3堆棧需求:2字節(jié)
?FPOP:POPACC;將返回地址保存在R2R3中
?MOVR2,A
POPACC
?MOVR3,A
INCR0
?INCR0
?POPACC;將操作數(shù)彈出堆棧,傳送到[R0]中
?MOV@R0,A
DECR0
POPACC
MOV@R0,A
DECR0
POPACC
?MOV@R0,A
MOVA,R3;將返回地址壓入堆棧
PUSHACC
?MOVA,R2
?PUSHACC
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:MOVA,@R0;數(shù)符比較
?XRLA,@R1
?JNBACC。7,CMP2
?MOVA,@R0;兩數(shù)異號(hào),以[R0]數(shù)符為準(zhǔn)
RLCA
?MOVA,#0FFH
RET
?CMP2:MOVA,@R1;兩數(shù)同號(hào),準(zhǔn)備比較階碼
?MOVC,ACC。6
?MOVACC。7,C
MOVB,A
MOVA,@R0
?MOVC,ACC.7
MOVF0,C;保存[R0]的數(shù)符
MOVC,ACC。6
?MOVACC。7,C
CLRC;比較階碼
?SUBBA,B
JZCMP6
?RLCA;取階碼之差的符號(hào)
?JNBF0,CMP5
?CPLC;[R0]為負(fù)時(shí),結(jié)果取反
CMP5:MOVA,#0FFH;兩數(shù)不相等
?RET
CMP6:INCR0;階碼相同時(shí),準(zhǔn)備比較尾數(shù)
?INCR0
INCR1
INCR1
?CLRC
MOVA,@R0
?SUBBA,@R1
MOVB,A;保存部分差
?DECR0
?DECR1
MOVA,@R0
SUBBA,@R1
?DECR0
?DECR1
ORLA,B;生成是否相等信息
JZCMP7
?JNBF0,CMP7
CPLC;[R0]為負(fù)時(shí),結(jié)果取反
CMP7:RET
?(12)標(biāo)號(hào):FABS功能:浮點(diǎn)絕對(duì)值函數(shù)
?入口條件:操作數(shù)在[R0]中。
?出口信息:結(jié)果仍在[R0]中。
?影響資源:A堆棧需求:2字節(jié)
FABS:MOVA,@R0;讀取操作數(shù)的階碼
CLRACC.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:INCR0;讀尾數(shù)
MOVA,@R0
INCR0
ORLA,@R0
?DECR0
DECR0
?JNZSGN
RET;尾數(shù)為零,結(jié)束
SGN:MOVA,@R0;讀取操作數(shù)的階碼
?RLCA;取數(shù)符
?MOVA,#1;按正數(shù)初始化
JNCSGN1;是正數(shù),結(jié)束
MOVA,#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:LCALLMVR0;將[R0]傳送到第一工作區(qū)中
?LCALLINT;在工作寄存器中完成取整運(yùn)算
LJMPMOV0;將結(jié)果傳回到[R0]中
INT:MOVA,R3
ORLA,R4
?JNZINTA
?CLR1FH;尾數(shù)為零,階碼也清零,結(jié)束取整
MOVR2,#41H
RET
INTA:MOVA,R2
JZINTB;階碼為零否?
JBACC。7,INTB;階符為負(fù)否?
?CLRC
?SUBBA,#10H;階碼小于16否?
JCINTD
?RET;階碼大于16,已經(jīng)是整數(shù)
INTB:CLRA;絕對(duì)值小于一,取整后正數(shù)為零,負(fù)數(shù)為負(fù)一
MOVR4,A
?MOVC,1FH
RRCA
MOVR3,A
RLA
?MOVR2,A
JNZINTC
?MOVR2,#41H
?INTC:RET
?INTD:CLRF0;舍尾標(biāo)志初始化
INTE:CLRC
LCALLRR1;右規(guī)一次
?ORLC,F(xiàn)0;記憶舍尾情況
MOVF0,C
CJNER2,#10H,INTE;階碼達(dá)到16(尾數(shù)完全為整數(shù))否?
JNBF0,INTF;舍去部分為零否?
JNB1FH,INTF;操作數(shù)為正數(shù)否?
INCR4;對(duì)于帶小數(shù)的負(fù)數(shù),向下取整
?MOVA,R4
JNZINTF
?INCR3
INTF:LJMPRLN;將結(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堆棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保項(xiàng)目可持續(xù)發(fā)展持續(xù)改進(jìn)計(jì)劃
- 急診與門診聯(lián)動(dòng)流程創(chuàng)新研究
- 獨(dú)立書店轉(zhuǎn)讓合同
- 2025年護(hù)士執(zhí)業(yè)資格考試題庫:護(hù)理科研方法與實(shí)踐護(hù)理健康教育護(hù)理管理試題
- 房屋預(yù)簽定金協(xié)議
- 兒科家庭醫(yī)生簽約服務(wù)計(jì)劃
- 電商運(yùn)營團(tuán)隊(duì)在市場(chǎng)推廣中的職責(zé)
- 2025年消防安全案例分析考試題庫試題集
- 筆記本電腦維保服務(wù)協(xié)議
- 2025年消防安全知識(shí)培訓(xùn)考試題庫:實(shí)操應(yīng)用篇消防安全教育培訓(xùn)試題
- CJJ-T 34-2022 城鎮(zhèn)供熱管網(wǎng)設(shè)計(jì)標(biāo)準(zhǔn)
- 小蝌蚪找媽媽(第一課時(shí))(省一等獎(jiǎng))
- 勘察設(shè)計(jì)工作大綱
- 道路運(yùn)輸從業(yè)資格證件換發(fā)、補(bǔ)發(fā)、變更登記表
- 配偶戶口調(diào)京央屬企事業(yè)單位有關(guān)規(guī)定
- 機(jī)動(dòng)車檢驗(yàn)員現(xiàn)場(chǎng)操作考核表.docx
- 事業(yè)單位1993歷次調(diào)整工資標(biāo)準(zhǔn)對(duì)照表
- 電氣工程及其自動(dòng)化專業(yè)英語詞匯
- 《多媒體技術(shù)與應(yīng)用》課程教學(xué)大綱
- SJG 68-2019 人行地下通道設(shè)計(jì)標(biāo)準(zhǔn)
- 品牌CIS導(dǎo)入報(bào)價(jià)表高端品牌文化理念加設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論