![51定點運算子程序庫及其使用說明_第1頁](http://file4.renrendoc.com/view/ee97b82e3cd9397d7613f8402b9ed14c/ee97b82e3cd9397d7613f8402b9ed14c1.gif)
![51定點運算子程序庫及其使用說明_第2頁](http://file4.renrendoc.com/view/ee97b82e3cd9397d7613f8402b9ed14c/ee97b82e3cd9397d7613f8402b9ed14c2.gif)
![51定點運算子程序庫及其使用說明_第3頁](http://file4.renrendoc.com/view/ee97b82e3cd9397d7613f8402b9ed14c/ee97b82e3cd9397d7613f8402b9ed14c3.gif)
![51定點運算子程序庫及其使用說明_第4頁](http://file4.renrendoc.com/view/ee97b82e3cd9397d7613f8402b9ed14c/ee97b82e3cd9397d7613f8402b9ed14c4.gif)
![51定點運算子程序庫及其使用說明_第5頁](http://file4.renrendoc.com/view/ee97b82e3cd9397d7613f8402b9ed14c/ee97b82e3cd9397d7613f8402b9ed14c5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
26/2651定點運算子程序庫及其使用說明
定點運算子程序庫文件名為DQ51.ASM,為便于使用,先將有關約定說明如下:
1.多字節(jié)定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續(xù)單元中的數?據.地址小的單元存放數據的高字節(jié)。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,?(31H)=34H,(32H)=56H。
2.運算精度:單次定點運算精度為結果最低位的當量值。?3.工作區(qū):數據工作區(qū)固定在PSW、A、B、R2~R7,用戶只要不在工作區(qū)中存放無?關的或非消耗性的信息,程序就具有較好的透明性。?(1)標號:BCDA功能:多字節(jié)BCD碼加法
入口條件:字節(jié)數在R7中,被加數在[R0]中,加數在[R1]中.
出口信息:和在[R0]中,最高位進位在CY中。
影響資源:PSW、A、R2堆棧需求:2字節(jié)
BCDA:MOVA,R7;取字節(jié)數至R2中
MOVR2,A
ADDA,R0;初始化數據指針
MOVR0,A?MOVA,R2?ADDA,R1?MOVR1,A?CLRC
BCD1:DECR0;調整數據指針
DECR1?MOVA,@R0?ADDCA,@R1;按字節(jié)相加?DAA;十進制調整?MOV@R0,A;和存回[R0]中
DJNZR2,BCD1;處理完所有字節(jié)?RET?(2)標號:BCDB功能:多字節(jié)BCD碼減法
入口條件:字節(jié)數在R7中,被減數在[R0]中,減數在[R1]中。?出口信息:差在[R0]中,最高位借位在CY中。?影響資源:PSW、A、R2、R3堆棧需求:6字節(jié)
BCDB:LCALLNEG1;減數[R1]十進制取補
LCALLBCDA;按多字節(jié)BCD碼加法處理?CPLC;將補碼加法的進位標志轉換成借位標志?MOVF0,C;保護借位標志?LCALLNEG1;恢復減數[R1]的原始值
MOVC,F0;恢復借位標志?RET
NEG1:MOVA,R0;[R1]十進制取補子程序入口?XCHA,R1;交換指針
XCHA,R0
LCALLNEG;通過[R0]實現[R1]取補?MOVA,R0?XCHA,R1;換回指針
XCHA,R0
RET???(3)標號:NEG功能:多字節(jié)BCD碼取補??入口條件:字節(jié)數在R7中,操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:PSW、A、R2、R3堆棧需求:2字節(jié)?NEG:MOVA,R7;取(字節(jié)數減一)至R2中
DECA?MOVR2,A?MOVA,R0;保護指針?MOVR3,A?NEG0:CLRC
MOVA,#99H?SUBBA,@R0;按字節(jié)十進制取補
MOV@R0,A;存回[R0]中?INCR0;調整數據指針
DJNZR2,NEG0;處理完(R2)字節(jié)
MOVA,#9AH;最低字節(jié)單獨取補
SUBBA,@R0?MOV@R0,A?MOVA,R3;恢復指針?MOVR0,A
RET?(4)標號:BRLN功能:多字節(jié)BCD碼左移十進制一位(乘十)
入口條件:字節(jié)數在R7中,操作數在[R0]中.?出口信息:結果仍在[R0]中,移出的十進制最高位在R3中。
影響資源:PSW、A、R2、R3堆棧需求:2字節(jié)?BRLN:MOVA,R7;取字節(jié)數至R2中?MOVR2,A
ADDA,R0;初始化數據指針?MOVR0,A?MOVR3,#0;工作單元初始化?BRL1:DECR0;調整數據指針?MOVA,@R0;取一字節(jié)
SWAPA;交換十進制高低位?MOV@R0,A;存回?MOVA,R3;取低字節(jié)移出的十進制高位?XCHDA,@R0;換出本字節(jié)的十進制高位?MOVR3,A;保存本字節(jié)的十進制高位
DJNZR2,BRL1;處理完所有字節(jié)
RET
(5)標號:MULD功能:雙字節(jié)二進制無符號數乘法
入口條件:被乘數在R2、R3中,乘數在R6、R7中。?出口信息:乘積在R2、R3、R4、R5中。?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)?MULD:MOVA,R3;計算R3乘R7
MOVB,R7?MULAB
MOVR4,B;暫存部分積
MOVR5,A?MOVA,R3;計算R3乘R6
MOVB,R6
MULAB
ADDA,R4;累加部分積?MOVR4,A
CLRA?ADDCA,B?MOVR3,A
MOVA,R2;計算R2乘R7?MOVB,R7
MULAB?ADDA,R4;累加部分積
MOVR4,A
MOVA,R3
ADDCA,B?MOVR3,A?CLRA
RLCA?XCHA,R2;計算R2乘R6?MOVB,R6
MULAB
ADDA,R3;累加部分積?MOVR3,A
MOVA,R2
ADDCA,B
MOVR2,A
RET?(6)標號:MUL2功能:雙字節(jié)二進制無符號數平方?入口條件:待平方數在R2、R3中。
出口信息:結果在R2、R3、R4、R5中。?影響資源:PSW、A、B、R2~R5堆棧需求:2字節(jié)
MUL2:MOVA,R3;計算R3平方
MOVB,A?MULAB
MOVR4,B;暫存部分積
MOVR5,A?MOVA,R2;計算R2平方
MOVB,A
MULAB
XCHA,R3;暫存部分積,并換出R2和R3?XCHA,B
XCHA,R2?MULAB;計算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)標號:DIVD功能:雙字節(jié)二進制無符號數除法
入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0時,雙字節(jié)商在R2、R3中,OV=1時溢出。
影響資源:PSW、A、B、R1~R7堆棧需求:2字節(jié)
DIVD:CLRC;比較被除數和除數?MOVA,R3
SUBBA,R7?MOVA,R2?SUBBA,R6
JCDVD1?SETBOV;溢出
RET
DVD1:MOVB,#10H;計算雙字節(jié)商?DVD2:CLRC;部分商和余數同時左移一位
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;計算(R2R3—R6R7)
MOVR1,A?MOVA,R2?SUBBA,R6
ANLC,/F0;結果判斷
JCDVD3?MOVR2,A;夠減,存放新的余數
MOVA,R1
MOVR3,A?INCR5;商的低位置一
DVD3:DJNZB,DVD2;計算完十六位商(R4R5)?MOVA,R4;將商移到R2R3中
MOVR2,A?MOVA,R5?MOVR3,A
CLROV;設立成功標志
RET?(8)標號:D457功能:雙字節(jié)二進制無符號數除以單字節(jié)二進制數?入口條件:被除數在R4、R5中,除數在R7中。
出口信息:OV=0時,單字節(jié)商在R3中,OV=1時溢出。?影響資源: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)標號:DV31功能:三字節(jié)二進制無符號數除以單字節(jié)二進制數?入口條件:被除數在R3、R4、R5中,除數在R7中。
出口信息:OV=0時,雙字節(jié)商在R4、R5中,OV=1時溢出。?影響資源: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)標號:MULS功能:雙字節(jié)二進制有符號數乘法(補碼)?
入口條件:被乘數在R2、R3中,乘數在R6、R7中。
出口信息:乘積在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R7堆棧需求:4字節(jié)?
MULS:MOVR4,#0;清零R4R5?MOVR5,#0?LCALLMDS;計算結果的符號和兩個操作數的絕對值?LCALLMULD;計算兩個絕對值的乘積?SJMPMDSE;用補碼表示結果
(11)標號:DIVS功能:雙字節(jié)二進制有符號數除法(補碼)?入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0時商在R2、R3中,OV=1時溢出.?影響資源:PSW、A、B、R1~R7堆棧需求:5字節(jié)?DIVS:LCALLMDS;計算結果的符號和兩個操作數的絕對值?PUSHPSW;保存結果的符號?LCALLDIVD;計算兩個絕對值的商?JNBOV,DVS1;溢出否??POPACC;溢出,放去結果的符號,保留溢出標志?RET
DVS1:POPPSW;未溢出,取出結果的符號?MOVR4,#0
MOVR5,#0
MDSE:JBF0,MDS2;用補碼表示結果?CLROV;結果為正,原碼即補碼,計算成功?RET?MDS:CLRF0;結果符號初始化
MOVA,R6;判斷第二操作數的符號?JNBACC。7,MDS1;為正,不必處理?CPLF0;為負,結果符號取反?XCHA,R7;第二操作數取補,得到其絕對值?CPLA?ADDA,#1
XCHA,R7
CPLA?ADDCA,#0?MOVR6,A?MDS1:MOVA,R2;判斷第一操作數或運算結果的符號?JNBACC。7,MDS3;為正,不必處理?CPLF0;為負,結果符號取反
MDS2:MOVA,R5;求第一操作數的絕對值或運算結果的補碼?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;運算成功
RET
(12)標號:SH2功能:雙字節(jié)二進制無符號數開平方(快速)?入口條件:被開方數在R2、R3中。
出口信息:平方根仍在R2、R3中,整數部分的位數為原數的一半,其余為小數.?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)
SH2:MOVA,R2?ORLA,R3?JNZSH20
RET;被開方數為零,不必運算?SH20:MOVR7,#0;左規(guī)次數初始化?MOVA,R2
SH22:ANLA,#0C0H;被開方數高字節(jié)小于40H否?
JNZSQRH;不小于40H,左規(guī)格化完成,轉開方過程
CLRC;每左規(guī)一次,被開方數左移兩位
MOVA,R3
RLCA?MOVF0,C
CLRC
RLCA?MOVR3,A?MOVA,R2
MOVACC.7,C?MOVC,F0
RLCA?RLCA
MOVR2,A
INCR7;左規(guī)次數加一?SJMPSH22;繼續(xù)左規(guī)?(13)標號:SH4功能:四字節(jié)二進制無符號數開平方(快速)?入口條件:被開方數在R2、R3、R4、R5中.?出口信息:平方根在R2、R3中,整數部分的位數為原數的一半,其余為小數。?影響資源:PSW、A、B、R2~R7堆棧需求:2字節(jié)?SH4:MOVA,R2
ORLA,R3?ORLA,R4?ORLA,R5
JNZSH40
RET;被開方數為零,不必運算?SH40:MOVR7,#0;左規(guī)次數初始化
MOVA,R2
SH41:ANLA,#0C0H;被開方數高字節(jié)小于40H否?
JNZSQRH;不小于40H,左規(guī)格化完成?MOVR6,#2;每左規(guī)一次,被開方數左移兩位?SH42:CLRC;被開方數左移一位?MOVA,R5?RLCA
MOVR5,A
MOVA,R4?RLCA
MOVR4,A
MOVA,R3
RLCA?MOVR3,A?MOVA,R2?RLCA?MOVR2,A
DJNZR6,SH42;被開方數左移完兩位
INCR7;左規(guī)次數加一?SJMPSH41;繼續(xù)左規(guī)?SQRH:MOVA,R2;規(guī)格化后高字節(jié)按折線法分為三個區(qū)間
ADDA,#57H?JCSQR2
ADDA,#45H
JCSQR1
ADDA,#24H
MOVB,#0E3H;第一區(qū)間的斜率
MOVR4,#80H;第一區(qū)間的平方根基數
SJMPSQR3?SQR1:MOVB,#0B2H;第二區(qū)間的斜率?MOVR4,#0A0H;第二區(qū)間的平方根基數
SJMPSQR3?SQR2:MOVB,#8DH;第三區(qū)間的斜率
MOVR4,#0D0H;第三區(qū)間的平方根基數?SQR3:MULAB;與區(qū)間基點的偏移量乘區(qū)間斜率?MOVA,B?ADDA,R4;累加到平方根的基數上?MOVR4,A?MOVB,A
MULAB;求當前平方根的冪
XCHA,R3;求偏移量(存放在R2R3中)?CLRC?SUBBA,R3
MOVR3,A
MOVA,R2?SUBBA,B?MOVR2,A?SQR4:SETBC;用減奇數法校正一個字節(jié)的平方根?MOVA,R4;當前平方根的兩倍加一存入R5R6中?RLCA?MOVR6,A?CLRA?RLCA?MOVR5,A?MOVA,R3;偏移量小于該奇數否??SUBBA,R6?MOVB,A
MOVA,R2
SUBBA,R5?JCSQR5;小于,校正結束,已達到一個字節(jié)的精度?INCR4;不小于,平方根加一
MOVR2,A;保存新的偏移量
MOVR3,B?SJMPSQR4;繼續(xù)校正?SQR5:MOVA,R4;將一個字節(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é)計算完,在R3中?MOVA,R7;取原被開方數的左規(guī)次數
JZSQRE;未左規(guī),開方結束?SQR9:CLRC;按左規(guī)次數右移平方根,得到實際根
MOVA,R2
RRCA
MOVR2,A
MOVA,R3?RRCA?MOVR3,A?DJNZR7,SQR9?SQRE:RET?(14)標號:HASC功能:單字節(jié)十六進制數轉換成雙字節(jié)ASCII碼
入口條件:待轉換的單字節(jié)十六進制數在累加器A中。
出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。?影響資源:PSW、A、B堆棧需求:4字節(jié)
HASC:MOVB,A;暫存待轉換的單字節(jié)十六進制數?LCALLHAS1;轉換低四位
XCHA,B;存放低四位的ASCII碼?SWAPA;準備轉換高四位
HAS1:ANLA,#0FH;將累加器的低四位轉換成ASCII碼
ADDA,#90H?DAA?ADDCA,#40H?DAA?RET?(15)標號:ASCH功能:ASCII碼轉換成十六進制數?入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。?出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。
影響資源:PSW、A堆棧需求:2字節(jié)
ASCH:CLRC
SUBBA,#30H
JNBACC。4,ASH1?SUBBA,#7
ASH1:RET?(16)標號:HBCD功能:單字節(jié)十六進制整數轉換成單字節(jié)BCD碼整數?入口條件:待轉換的單字節(jié)十六進制整數在累加器A中.?出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。
影響資源:PSW、A、B、R3堆棧需求:2字節(jié)?HBCD:MOVB,#100;分離出百位,存放在R3中
DIVAB
MOVR3,A
MOVA,#10;余數繼續(xù)分離十位和個位
XCHA,B
DIVAB?SWAPA
ORLA,B;將十位和個位拼裝成BCD碼
RET
(17)標號:HB2功能:雙字節(jié)十六進制整數轉換成雙字節(jié)BCD碼整數?入口條件:待轉換的雙字節(jié)十六進制整數在R6、R7中。
出口信息:轉換后的三字節(jié)BCD碼整數在R3、R4、R5中。
影響資源:PSW、A、R2~R7堆棧需求:2字節(jié)
HB2:CLRA;BCD碼初始化
MOVR3,A
MOVR4,A?MOVR5,A
MOVR2,#10H;轉換雙字節(jié)十六進制整數
HB3:MOVA,R7;從高端移出待轉換數的一位到CY中?RLCA
MOVR7,A
MOVA,R6?RLCA?MOVR6,A?MOVA,R5;BCD碼帶進位自身相加,相當于乘2
ADDCA,R5
DAA;十進制調整?MOVR5,A
MOVA,R4?ADDCA,R4?DAA?MOVR4,A?MOVA,R3?ADDCA,R3
MOVR3,A;雙字節(jié)十六進制數的萬位數不超過6,不用調整?DJNZR2,HB3;處理完16bit?RET
(18)標號:HBD功能:單字節(jié)十六進制小數轉換成單字節(jié)BCD碼小數
入口條件:待轉換的單字節(jié)十六進制小數在累加器A中。
出口信息:CY=0時轉換后的BCD碼小數仍在A中.CY=1時原小數接近整數1.?影響資源:PSW、A、B堆棧需求:2字節(jié)?HBD:MOVB,#100;原小數擴大一百倍
MULAB?RLCA;余數部分四舍五入?CLRA
ADDCA,B
MOVB,#10;分離出十分位和百分位?DIVAB?SWAPA
ADDA,B;拼裝成單字節(jié)BCD碼小數?DAA;調整后若有進位,原小數接近整數1
RET
(19)標號:HBD2功能:雙字節(jié)十六進制小數轉換成雙字節(jié)BCD碼小數?入口條件:待轉換的雙字節(jié)十六進制小數在R2、R3中。
出口信息:轉換后的雙字節(jié)BCD碼小數仍在R2、R3中。?影響資源:PSW、A、B、R2、R3、R4、R5堆棧需求:6字節(jié)?HBD2:MOVR4,#4;四位十進制碼?HBD3:MOVA,R3;原小數擴大十倍?MOVB,#10
MULAB?MOVR3,A?MOVR5,B?MOVA,R2
MOVB,#10
MULAB?ADDA,R5
MOVR2,A?CLRA?ADDCA,B
PUSHACC;保存溢出的一位十進制碼?DJNZR4,HBD3;計算完四位十進制碼?POPACC;取出萬分位
MOVR3,A?POPACC;取出千分位?SWAPA
ORLA,R3;拼裝成低字節(jié)BCD碼小數
MOVR3,A
POPACC;取出百分位?MOVR2,A?POPACC;取出十分位
SWAPA?ORLA,R2;拼裝成高字節(jié)BCD碼小數
MOVR2,A?RET
(20)標號:BCDH功能:單字節(jié)BCD碼整數轉換成單字節(jié)十六進制整數
入口條件:待轉換的單字節(jié)BCD碼整數在累加器A中。
出口信息:轉換后的單字節(jié)十六進制整數仍在累加器A中.?影響資源:PSW、A、B、R4堆棧需求:2字節(jié)??BCDH:MOVB,#10H;分離十位和個位
DIVAB?MOVR4,B;暫存?zhèn)€位?MOVB,#10;將十位轉換成十六進制
MULAB
ADDA,R4;按十六進制加上個位?RET?(21)標號:BH2功能:雙字節(jié)BCD碼整數轉換成雙字節(jié)十六進制整數?入口條件:待轉換的雙字節(jié)BCD碼整數在R2、R3中。?出口信息:轉換后的雙字節(jié)十六進制整數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4堆棧需求:4字節(jié)
BH2:MOVA,R3;將低字節(jié)轉換成十六進制?LCALLBCDH
MOVR3,A
MOVA,R2;將高字節(jié)轉換成十六進制?LCALLBCDH?MOVB,#100;擴大一百倍?MULAB
ADDA,R3;和低字節(jié)按十六進制相加
MOVR3,A?CLRA
ADDCA,B?MOVR2,A?RET?(22)標號:BHD功能:單字節(jié)BCD碼小數轉換成單字節(jié)十六進制小數?入口條件:待轉換的單字節(jié)BCD碼數在累加器A中。?出口信息:轉換后的單字節(jié)十六進制小數仍在累加器A中.
影響資源:PSW、A、R2、R3堆棧需求:2字節(jié)?BHD:MOVR2,#8;準備計算一個字節(jié)小數?BHD0:ADDA,ACC;按十進制倍增?DAA
XCHA,R3
RLCA;將進位標志移入結果中?XCHA,R3
DJNZR2,BHD0;共計算8bit小數
ADDA,#0B0H;剩余部分達到0.50否?
JNCBHD1;四舍?INCR3;五入
BHD1:MOVA,R3;取結果
RET
(23)標號:BHD2功能:雙字節(jié)BCD碼小數轉換成雙字節(jié)十六進制小數
入口條件:待轉換的雙字節(jié)BCD碼小數在R4、R5中。?出口信息:轉換后的雙字節(jié)十六進制小數在R2、R3中。*
影響資源:PSW、A、R2~R6堆棧需求:2字節(jié)?BHD2:MOVR6,#10H;準備計算兩個字節(jié)小數
BHD3:MOVA,R5;按十進制倍增?ADDA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A?MOVA,R3;將進位標志移入結果中?RLCA?MOVR3,A?MOVA,R2?RLCA?MOVR2,A?DJNZR6,BHD3;共計算16bit小數
MOVA,R4?ADDA,#0B0H;剩余部分達到0.50否??JNCBHD4;四舍
INCR3;五入
MOVA,R3
JNZBHD4
INCR2?BHD4:RET
(24)標號:MM功能:求單字節(jié)十六進制無符號數據塊的極值?入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中.?影響資源:PSW、A、B、R1~R7堆棧需求:4字節(jié)
MM:MOVB,R7;保存數據個數
MOVXA,@DPTR;讀取第一個數據
MOVR6,A;作為最大值的初始值
MOVR7,A;也作為最小值的初始值
MOVA,DPL;取第一個數據的地址
MOVR3,A;作為最大值存放地址的初始值
MOVR5,A;也作為最小值存放地址的初始值?MOVA,DPH
MOVR2,A?MOVR4,A
MOVA,B;取數據個數
DECA;減一,得到需要比較的次數?JZMME;只有一個數據,不需要比較
MOVR1,A;保存比較次數?PUSHDPL;保護數據塊的首址
PUSHDPH?MM1:INCDPTR;指向一個新的數據?MOVXA,@DPTR;讀取這個數據?MOVB,A;保存?SETBC;與最大值比較?SUBBA,R6?JCMM2;不超過當前最大值,保持當前最大值?MOVR6,B;超過當前最大值,更新最大值存放地址?MOVR2,DPH;同時更新最大值存放地址
MOVR3,DPL
SJMPMM3?MM2:MOVA,B;與最小值比較?CLRC?SUBBA,R7?JNCMM3;大于或等于當前最小值,保持當前最小值?MOVR7,B;更新最小值?MOVR4,DPH;更新最小值存放地址
MOVR5,DPL?MM3:DJNZR1,MM1;處理完全部數據
POPDPH;恢復數據首址?POPDPL?MME:RET?(25)標號:MMS功能:求單字節(jié)十六進制有符號數據塊的極值?入口條件:數據塊的首址在DPTR中,數據個數在R7中.?出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影響資源:PSW、A、B、R1~R7堆棧需求:4字節(jié)?MMS:MOVB,R7;保存數據個數?MOVXA,@DPTR;讀取第一個數據?MOVR6,A;作為最大值的初始值
MOVR7,A;也作為最小值的初始值
MOVA,DPL;取第一個數據的地址
MOVR3,A;作為最大值存放地址的初始值
MOVR5,A;也作為最小值存放地址的初始值
MOVA,DPH
MOVR2,A
MOVR4,A?MOVA,B;取數據個數?DECA;減一,得到需要比較的次數
JZMMSE;只有一個數據,不需要比較
MOVR1,A;保存比較次數
PUSHDPL;保護數據塊的首址?PUSHDPH
MMS1:INCDPTR;調整數據指針?MOVXA,@DPTR;讀取一個數據
MOVB,A;保存
SETBC;與最大值比較
SUBBA,R6
JZMMS4;相同,不更新最大值?JNBOV,MMS2;差未溢出,符號位有效
CPLACC。7;差溢出,符號位取反?MMS2:JBACC。7,MMS4;差為負,不更新最大值?MOVR6,B;更新最大值
MOVR2,DPH;更新最大值存放地址
MOVR3,DPL
SJMPMMS7?MMS4:MOVA,B;與最小值比較
CLRC
SUBBA,R7?JNBOV,MMS6;差未溢出,符號位有效?CPLACC.7;差溢出,符號位取反
MMS6:JNBACC.7,MMS7;差為正,不更新最小值?MOVR7,B;更新最小值
MOVR4,DPH;更新最小值存放地址
MOVR5,DPL?MMS7:DJNZR1,MMS1;處理完全部數據?POPDPH;恢復數據首址?POPDPL?MMSE:RET?(26)標號:FDS1功能:順序查找(ROM)單字節(jié)表格?入口條件:待查找的內容在A中,表格首址在DPTR中,表格的字節(jié)數在R7中.?出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。?影響資源:PSW、A、B、R2、R6堆棧需求:2字節(jié)
FDS1:MOVB,A;保存待查找的內容
MOVR2,#0;順序號初始化(指向表首)
MOVA,R7;保存表格的長度
MOVR6,A
FD11:MOVA,R2;按順序號讀取表格內容
MOVCA,@A+DPTR?CJNEA,B,FD12;與待查找的內容比較
CLROV;相同,查找成功
MOVA,R2;取對應的順序號
RET?FD12:INCR2;指向表格中的下一個內容
DJNZR6,FD11;查完全部表格內容?SETBOV;未查找到,失敗?RET
(27)標號:FDS2功能:順序查找(ROM)雙字節(jié)表格
入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據總個數在R7中。?出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到.?影響資源:PSW、A、R2、R6、DPTR堆棧需求:2字節(jié)??FDS2:MOVA,R7;保存表格中數據的個數
MOVR6,A?MOVR2,#0;順序號初始化(指向表首)
FD21:CLRA;讀取表格內容的高字節(jié)?MOVCA,@A+DPTR
XRLA,R4;與待查找內容的高字節(jié)比較?JNZFD22
MOVA,#1;讀取表格內容的低字節(jié)
MOVCA,@A+DPTR?XRLA,R5;與待查找內容的低字節(jié)比較?JNZFD22?CLROV;相同,查找成功
MOVA,R2;取對應的順序號?RET?FD22:INCDPTR;指向下一個數據
INCDPTR?INCR2;順序號加一?DJNZR6,FD21;查完全部數據
SETBOV;未查找到,失敗
RET
(28)標號:FDD1功能:對分查找(ROM)單字節(jié)無符號增序數據表格
入口條件:待查找的內容在累加器A中,表格首址在DPTR中,字節(jié)數在R7中.?出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。?影響資源:PSW、A、B、R2、R3、R4堆棧需求:2字節(jié)?FDD1:MOVB,A;保存待查找的內容
MOVR2,#0;區(qū)間低端指針初始化(指向第一個數據)
MOVA,R7
DECA?MOVR3,A;區(qū)間高端指針初始化(指向最后一個數據)
FD61:CLRC;判斷區(qū)間大小
MOVA,R3?SUBBA,R2
JCFD69;區(qū)間消失,查找失敗
RRCA;取區(qū)間大小的一半
ADDA,R2;加上區(qū)間的低端?MOVR4,A;得到區(qū)間的中心
MOVCA,@A+DPTR;讀取該點的內容
CJNEA,B,FD65;與待查找的內容比較?CLROV;相同,查找成功?MOVA,R4;取順序號?RET?FD65:JCFD68;該點的內容比待查找的內容大否??MOVA,R4;偏大,取該點位置
DECA;減一
MOVR3,A;作為新的區(qū)間高端?SJMPFD61;繼續(xù)查找?FD68:MOVA,R4;偏小,取該點位置
INCA;加一
MOVR2,A;作為新的區(qū)間低端
SJMPFD61;繼續(xù)查找?FD69:SETBOV;查找失敗
RET
(29)標號:FDD2功能:對分查找(ROM)雙字節(jié)無符號增序數據表格?入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據個數在R7中。?出口信息:OV=0時順序號在累加器A中,址在DPTR中;OV=1時未找到。
影響資源:PSW、A、B、R1~R7、DPTR堆棧需求:2字節(jié)??FDD2:MOVR2,#0;區(qū)間低端指針初始化(指向第一個數據)?MOVA,R7
DECA
MOVR3,A;區(qū)間高端指針初始化,指向最后一個數據
MOVR6,DPH;保存表格首址?MOVR7,DPL?FD81:CLRC;判斷區(qū)間大小
MOVA,R3?SUBBA,R2?JCFD89;區(qū)間消失,查找失敗?RRCA;取區(qū)間大小的一半?ADDA,R2;加上區(qū)間的低端?MOVR1,A;得到區(qū)間的中心?MOVDPH,R6?CLRC;計算區(qū)間中心的地址?RLCA?JNCFD82
INCDPH?FD82:ADDA,R7?MOVDPL,A
JNCFD83
INCDPH?FD83:CLRA;讀取該點的內容的高字節(jié)
MOVCA,@A+DPTR?MOVB,R4;與待查找內容的高字節(jié)比較?CJNEA,B,FD84;不相同?MOVA,#1;讀取該點的內容的低字節(jié)
MOVCA,@A+DPTR?MOVB,R5?CJNEA,B,FD84;與待查找內容的低字節(jié)比較?MOVA,R1;取順序號?CLROV;查找成功
RET
FD84:JCFD86;該點的內容比待查找的內容大否??MOVA,R1;偏大,取該點位置
DECA;減一?MOVR3,A;作為新的區(qū)間高端
SJMPFD81;繼續(xù)查找?FD86:MOVA,R1;偏小,取該點位置
INCA;加一
MOVR2,A;作為新的區(qū)間低端
SJMPFD81;繼續(xù)查找
FD89:MOVDPH,R6;相同,恢復首址
MOVDPL,R7
SETBOV;查找失敗?RET
(30)標號:DDM1功能:求單字節(jié)十六進制無符號數據塊的平均值
入口條件:數據塊的首址在DPTR中,數據個數在R7中。
出口信息:平均值在累加器A中。?影響資源:PSW、A、R2~R6堆棧需求:4字節(jié)
DDM1:MOVA,R7;保存數據個數?MOVR2,A
PUSHDPH?PUSHDPL?CLRA;初始化累加和?MOVR4,A?MOVR5,A
DM11:MOVXA,@DPTR;讀取一個數據
ADDA,R5;累加到累加和中
MOVR5,A
JNCDM12?INCR4?DM12:INCDPTR;調整指針
DJNZR2,DM11;累加完全部數據?LCALLD457;求平均值(R4R5/R7-→R3)
MOVA,R3;取平均值
POPDPL?POPDPH
RET?(31)標號:DDM2功能:求雙字節(jié)十六進制無符號數據塊的平均值
入口條件:數據塊的首址在DPTR中,雙字節(jié)數據總個數在R7中。
出口信息:平均值在R4、R5中。?影響資源:PSW、A、R2~R6堆棧需求:4字節(jié)?
DDM2:MOVA,R7;保存數據個數
MOVR2,A;初始化數據指針
PUSHDPL;保持首址
PUSHDPH
CLRA;初始化累加和
MOVR3,A
MOVR4,A?MOVR5,A?DM20:MOVXA,@DPTR;讀取一個數據的高字節(jié)?MOVB,A
INCDPTR
MOVXA,@DPTR;讀取一個數據的低字節(jié)?INCDPTR
ADDA,R5;累加到累加和中?MOVR5,A?MOVA,B?ADDCA,R4
MOVR4,A
JNCDM21
INCR3
DM21:DJNZR2,DM20;累加完全部數據?POPDPH;恢復首址?POPDPL?LJMPDV31;求R3R4R5/R7-→R4R5,得到平均值
(32)標號:XR1功能:求單字節(jié)數據塊的(異或)校驗和
入口條件:數據塊的首址在DPTR中,數據的個數在R6、R7中。
出口信息:校驗和在累加器A中.?影響資源:PSW、A、B、R4~R7堆棧需求:2字節(jié)?XR1:MOVR4,DPH;保存數據塊的首址
MOVR5,DPL?MOVA,R7;雙字節(jié)計數器調整
JZXR10?INCR6
XR10:MOVB,#0;校驗和初始化
XR11:MOVXA,@DPTR;讀取一個數據
XRLB,A;異或運算
INCDPTR;指向下一個數據?DJNZR7,XR11;雙字節(jié)計數器減一?DJNZR6,XR11
MOVDPH,R4;恢復數據首址
MOVDPL,R5
MOVA,B;取校驗和
RET?(33)標號:XR2功能:求雙字節(jié)數據塊的(異或)校驗和
入口條件:數據塊的首址在DPTR中,雙字節(jié)數據總個數在R6、R7中。?出口信息:校驗和在R2、R3中。?影響資源:PSW、A、R2~R7堆棧需求:2字節(jié)
XR2:MOVR4,DPH;保存數據塊的首址?MOVR5,DPL
MOVA,R7;雙字節(jié)計數器調整
JZXR20?INCR6?XR20:CLRA;校驗和初始化
MOVR2,A?MOVR3,A?XR21:MOVXA,@DPTR;讀取一個數據的高字節(jié)
XRLA,R2;異或運算?MOVR2,A
INCDPTR
MOVXA,@DPTR;讀取一個數據的低字節(jié)?XRLA,R3;異或運算?MOVR3,A?INCDPTR;指向下一個數據?DJNZR7,XR21;雙字節(jié)計數器減一?DJNZR6,XR21
MOVDPH,R4;恢復數據首址
MOVDPL,R5?RET?(34)標號:SORT功能:單字節(jié)無符號數據塊排序(增序)
入口條件:數據塊的首址在R0中,字節(jié)數在R7中。
出口信息:完成排序(增序)
影響資源:PSW、A、R2~R6堆棧需求:2字節(jié)?SORT:MOVA,R7
MOVR5,A;比較次數初始化
SRT1:CLRF0;交換標志初始化
MOVA,R5;取上遍比較次數
DECA;本遍比上遍減少一次
MOVR5,A;保存本遍次數?MOVR2,A;復制到計數器中?JZSRT5;若為零,排序結束?MOVA,R0;保存數據指針
MOVR6,A?SRT2:MOVA,@R0;讀取一個數據?MOVR3,A
INCR0;指向下一個數據
MOVA,@R0;再讀取一個數據
MOVR4,A
CLRC?SUBBA,R3;比較兩個數據的大小?JNCSRT4;順序正確(增序或相同),不必交換
SETBF0;設立交換標志?MOVA,R3;將兩個數據交換位置?MOV@R0,A
DECR0?MOVA,R4?MOV@R0,A?INCR0;指向下一個數據
SRT4:DJNZR2,SRT2;完成本遍的比較次數
MOVA,R6;恢復數據首址?MOVR0,A
JBF0,SRT1;本遍若進行過交換,則需繼續(xù)排序?SRT5:RET;排序結束
END(二)51浮點運算子程序庫及其使用說明
?本浮點子程序庫有三個不同層次的版本,以便適應不同的應用場合:
1。小型庫(FQ51A.ASM):只包含浮點加、減、乘、除子程序。
2.中型庫(FQ51B。ASM):在小型庫的基礎上再增加絕對值、倒數、比較、平方、開平方、
?數制轉換等子程序。
3.大型庫(FQ51。ASM):包含本說明書中的全部子程序。
為便于讀者使用本程序庫,先將有關約定說明如下:
1.雙字節(jié)定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續(xù)單元中的數
?據,地址小的單元存放高字節(jié)。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H.
?2.二進制浮點操作數:用三個字節(jié)表示,第一個字節(jié)的最高位為數符,其余七位為
?階碼(補碼形式),第二字節(jié)為尾數的高字節(jié),第三字節(jié)為尾數的低字節(jié),尾數用雙字節(jié)
?純小數(原碼)來表示。當尾數的最高位為1時,便稱為規(guī)格化浮點數,簡稱操作數。在
?程序說明中,也用[R0]或[R1]來表示R0或R1指示的浮點操作數,例如:當[R0]=-6.000時,
則二進制浮點數表示為83C000H.若(R0)=30H,則(30H)=83H,(31H)=0C0H,(32H)=00H。
?3.十進制浮點操作數:用三個字節(jié)表示,第一個字節(jié)的最高位為數符,其余七位為
階碼(二進制補碼形式),第二字節(jié)為尾數的高字節(jié),第三字節(jié)為尾數的低字節(jié),尾數用
雙字節(jié)BCD碼純小數(原碼)來表示。當十進制數的絕對值大于1時,階碼就等于整數
部分的位數,如876.5的階碼是03H,—876.5的階碼是83H;當十進制數的絕對值小于1
?時,階碼就等于80H減去小數點后面零的個數,例如0.00382的階碼是7EH,-0。00382
?的階碼是0FEH。在程序說明中,用[R0]或[R1]來表示R0或R1指示的十進制浮點操作數。例
?如有一個十進制浮點操作數存放在30H、31H、32H中,數值是-0。07315,即—0.7315乘以10
的-1次方,則(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]來指向它,則應使(R0)=30H。
4.運算精度:單次定點運算精度為結果最低位的當量值;單次二進制浮點算術運算
的精度優(yōu)于十萬分之三;單次二進制浮點超越函數運算的精度優(yōu)于萬分之一;BCD碼浮
點數本身的精度比較低(萬分之一到千分之一),不宜作為運算的操作數,僅用于輸入或
輸出時的數制轉換。不管那種數據格式,隨著連續(xù)運算的次數增加,精度都會下降。
?5.工作區(qū):數據工作區(qū)固定在A、B、R2~R7,數符或標志工作區(qū)固定在PSW和23H單
?元(位1CH~1FH)。在浮點系統中,R2、R3、R4和位1FH為第一工作區(qū),R5、R6、R7和位1EH
為第二工作區(qū)。用戶只要不在工作區(qū)中存放無關的或非消耗性的信息,程序就具有較好的
透明性。
6。子程序調用范例:由于本程序庫特別注意了各子程序接口的相容性,很容易采用
?積木方式(或流水線方式)完成一個公式的計算.以浮點運算為例:
?計算y=Ln√|Sin(ab/c+d)|
?已知:a=-123.4;b=0。7577;c=56.34;d=1.276;它們分別存放在30H、33H、36H、
?39H開始的連續(xù)三個單元中。用BCD碼浮點數表示時,分別為a=831234H;b=007577H;
?c=025634H;d=011276H。
?求解過程:通過調用BTOF子程序,將各變量轉換成二進制浮點操作數,再進行各
種運算,最后調用FTOB子程序,還原成十進制形式,供輸出使用。程序如下:
TEST:MOVR0,#39H;指向BCD碼浮點操作數d
?LCALLBTOF;將其轉換成二進制浮點操作數
?MOVR0,#36H;指向BCD碼浮點操作數c
?LCALLBTOF;將其轉換成二進制浮點操作數
MOVR0,#33H;指向BCD碼浮點操作數b
?LCALLBTOF;將其轉換成二進制浮點操作數
MOVR0,#30H;指向BCD碼浮點操作數a
LCALLBTOF;將其轉換成二進制浮點操作數
?MOVR1,#33H;指向二進制浮點操作數b
?LCALLFMUL;進行浮點乘法運算
?MOVR1,#36H;指向二進制浮點操作數c
LCALLFDIV;進行浮點除法運算
?MOVR1,#39H;指向二進制浮點操作數d
LCALLFADD;進行浮點加法運算
?LCALLFSIN;進行浮點正弦運算
?LCALLFABS;進行浮點絕對值運算
?LCALLFSQR;進行浮點開平方運算
LCALLFLN;進行浮點對數運算
?LCALLFTOB;將結果轉換成BCD碼浮點數
?STOP:LJMPSTOP
?END
運行結果,[R0]=804915H,即y=—0。4915,比較精確的結果應該是-0。491437。
?(1)標號:FSDT功能:浮點數格式化
?入口條件:待格式化浮點操作數在[R0]中。
出口信息:已格式化浮點操作數仍在[R0]中。
?影響資源:PSW、A、R2、R3、R4、位1FH堆棧需求:6字節(jié)
FSDT:LCALLMVR0;將待格式化操作數傳送到第一工作區(qū)中
LCALLRLN;通過左規(guī)完成格式化
?LJMPMOV0;將已格式化浮點操作數傳回到[R0]中
(2)標號:FADD功能:浮點數加法
入口條件:被加數在[R0]中,加數在[R1]中.
出口信息:OV=0時,和仍在[R0]中,OV=1時,溢出.
?影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:6字節(jié)
?FADD:CLRF0;設立加法標志
SJMPAS;計算代數和
?(3)標號:FSUB功能:浮點數減法
入口條件:被減數在[R0]中,減數在[R1]中。
出口信息:OV=0時,差仍在[R0]中,OV=1時,溢出。
?影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:6字節(jié)
?FSUB:SETBF0;設立減法標志
AS:LCALLMVR1;計算代數和。先將[R1]傳送到第二工作區(qū)
MOVC,F0;用加減標志來校正第二操作數的有效符號
?RRCA
?XRLA,@R1
?MOVC,ACC.7
?ASN:MOV1EH,C;將第二操作數的有效符號存入位1EH中
XRLA,@R0;與第一操作數的符號比較
RLCA
?MOVF0,C;保存比較結果
?LCALLMVR0;將[R0]傳送到第一工作區(qū)中
LCALLAS1;在工作寄存器中完成代數運算
MOV0:INCR0;將結果傳回到[R0]中的子程序入口
INCR0
?MOVA,R4;傳回尾數的低字節(jié)
?MOV@R0,A
DECR0
?MOVA,R3;傳回尾數的高字節(jié)
MOV@R0,A
DECR0
?MOVA,R2;取結果的階碼
?MOVC,1FH;取結果的數符
?MOVACC.7,C;拼入階碼中
MOV@R0,A
?CLRACC.7;不考慮數符
CLROV;清除溢出標志
?CJNEA,#3FH,MV01;階碼是否上溢?
SETBOV;設立溢出標志
MV01:MOVA,@R0;取出帶數符的階碼
RET
MVR0:MOVA,@R0;將[R0]傳送到第一工作區(qū)中的子程序
MOVC,ACC。7;將數符保存在位1FH中
?MOV1FH,C
MOVC,ACC.6;將階碼擴充為8bit補碼
MOVACC.7,C
?MOVR2,A;存放在R2中
INCR0
?MOVA,@R0;將尾數高字節(jié)存放在R3中
?MOVR3,A
INCR0
?MOVA,@R0;將尾數低字節(jié)存放在R4中
MOVR4,A
DECR0;恢復數據指針
DECR0
RET
?MVR1:MOVA,@R1;將[R1]傳送到第二工作區(qū)中的子程序
?MOVC,ACC.7;將數符保存在位1EH中
?MOV1EH,C
MOVC,ACC.6;將階碼擴充為8bit補碼
MOVACC。7,C
MOVR5,A;存放在R5中
INCR1
?MOVA,@R1;將尾數高字節(jié)存放在R6中
MOVR6,A
?INCR1
MOVA,@R1;將尾數低字節(jié)存放在R7中
MOVR7,A
DECR1;恢復數據指針
?DECR1
?RET
AS1:MOVA,R6;讀取第二操作數尾數高字節(jié)
?ORLA,R7
JZAS2;第二操作數為零,不必運算
MOVA,R3;讀取第一操作數尾數高字節(jié)
ORLA,R4
?JNZEQ1
?MOVA,R6;第一操作數為零,結果以第二操作數為準
?MOVR3,A
MOVA,R7
MOVR4,A
?MOVA,R5
?MOVR2,A
MOVC,1EH
MOV1FH,C
AS2:RET
?EQ1:MOVA,R2;對階,比較兩個操作數的階碼
?XRLA,R5
?JZAS4;階碼相同,對階結束
?JBACC.7,EQ3;階符互異
?MOVA,R2;階符相同,比較大小
?CLRC
?SUBBA,R5
JCEQ4
EQ2:CLRC;第二操作數右規(guī)一次
?MOVA,R6;尾數縮小一半
RRCA
MOVR6,A
?MOVA,R7
RRCA
?MOVR7,A
INCR5;階碼加一
ORLA,R6;尾數為零否?
?JNZEQ1;尾數不為零,繼續(xù)對階
MOVA,R2;尾數為零,提前結束對階
MOVR5,A
SJMPAS4
EQ3:MOVA,R2;判斷第一操作數階符
JNBACC。7,EQ2;如為正,右規(guī)第二操作數
EQ4:CLRC
LCALLRR1;第一操作數右規(guī)一次
?ORLA,R3;尾數為零否?
?JNZEQ1;不為零,繼續(xù)對階
?MOVA,R5;尾數為零,提前結束對階
?MOVR2,A
?AS4:JBF0,AS5;尾數加減判斷
?MOVA,R4;尾數相加
?ADDA,R7
MOVR4,A
?MOVA,R3
?ADDCA,R6
?MOVR3,A
JNCAS2
LJMPRR1;有進位,右規(guī)一次
AS5:CLRC;比較絕對值大小
?MOVA,R4
?SUBBA,R7
?MOVB,A
?MOVA,R3
SUBBA,R6
JCAS6
?MOVR4,B;第一尾數減第二尾數
?MOVR3,A
LJMPRLN;結果規(guī)格化
AS6:CPL1FH;結果的符號與第一操作數相反
?CLRC;結果的絕對值為第二尾數減第一尾數
MOVA,R7
?SUBBA,R4
?MOVR4,A
MOVA,R6
?SUBBA,R3
?MOVR3,A
RLN:MOVA,R3;浮點數規(guī)格化
ORLA,R4;尾數為零否?
?JNZRLN1
?MOVR2,#0C1H;階碼取最小值
RET
?RLN1:MOVA,R3
?JBACC。7,RLN2;尾數最高位為一否?
CLRC;不為一,左規(guī)一次
?LCALLRL1
?SJMPRLN;繼續(xù)判斷
?RLN2:CLROV;規(guī)格化結束
?RET
RL1:MOVA,R4;第一操作數左規(guī)一次
RLCA;尾數擴大一倍
MOVR4,A
?MOVA,R3
?RLCA
?MOVR3,A
?DECR2;階碼減一
CJNER2,#0C0H,RL1E;階碼下溢否?
CLRA
?MOVR3,A;階碼下溢,操作數以零計
?MOVR4,A
MOVR2,#0C1H
?RL1E:CLROV
?RET
RR1:MOVA,R3;第一操作數右規(guī)一次
?RRCA;尾數縮小一半
?MOVR3,A
MOVA,R4
?RRCA
MOVR4,A
INCR2;階碼加一
?CLROV;清溢出標志
CJNER2,#40H,RR1E;階碼上溢否?
MOVR2,#3FH;階碼溢出
?SETBOV
?RR1E:RET
(4)標號:FMUL功能:浮點數乘法
?入口條件:被乘數在[R0]中,乘數在[R1]中.
出口信息:OV=0時,積仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:6字節(jié)
?FMUL:LCALLMVR0;將[R0]傳送到第一工作區(qū)中
?MOVA,@R0
XRLA,@R1;比較兩個操作數的符號
?RLCA
?MOV1FH,C;保存積的符號
LCALLMUL0;計算積的絕對值
?LJMPMOV0;將結果傳回到[R0]中
MUL0:LCALLMVR1;將[R1]傳送到第二工作區(qū)中
MUL1:MOVA,R3;第一尾數為零否?
?ORLA,R4
JZMUL6
?MOVA,R6;第二尾數為零否?
?ORLA,R7
JZMUL5
MOVA,R7;計算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ī)格化數否?
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;階碼上溢,設立標志
SETBOV
?RET
MUL4:JBACC.6,MUL6
?MUL5:CLRA;結果清零(因子為零或階碼下溢)
?MOVR3,A
?MOVR4,A
?MOVR2,#41H
MUL6:CLROV
?RET
(5)標號:FDIV功能:浮點數除法
?入口條件:被除數在[R0]中,除數在[R1]中。
出口信息:OV=0時,商仍在[R0]中,OV=1時,溢出。
影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧需求:5字節(jié)
?FDIV:INCR0
MOVA,@R0
INCR0
ORLA,@R0
?DECR0
?DECR0
JNZDIV1
MOV@R0,#41H;被除數為零,不必運算
?CLROV
?RET
DIV1:INCR1
?MOVA,@R1
INCR1
ORLA,@R1
?DECR1
?DECR1
JNZDIV2
?SETBOV;除數為零,溢出
?RET
DIV2:LCALLMVR0;將[R0]傳送到第一工作區(qū)中
?MOVA,@R0
?XRLA,@R1;比較兩個操作數的符號
?RLCA
?MOV1FH,C;保存結果的符號
LCALLMVR1;將[R1]傳送到第二工作區(qū)中
LCALLDIV3;調用工作區(qū)浮點除法
?LJMPMOV0;回傳結果
DIV3:CLRC;比較尾數的大小
?MOVA,R4
SUBBA,R7
?MOVA,R3
?SUBBA,R6
?JCDIV4
?LCALLRR1;被除數右規(guī)一次
?SJMPDIV3
DIV4:CLRA;借用R0R1R2作工作寄存器
?XCHA,R0;清零并保護之
PUSHACC
?CLRA
XCHA,R1
PUSHACC
?MOVA,R2
?PUSHACC
?MOVB,#10H;除法運算,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;將結果存回R3R4
?MOVR4,A
?CLRA
?ADDCA,R0
MOVR3,A
?POPACC;恢復R0R1R2
MOVR2,A
?POPACC
MOVR1,A
?POPACC
MOVR0,A
?MOVA,R2;計算商的階碼
?CLRC
?SUBBA,R5
LCALLMD;階碼檢驗
?LJMPRLN;規(guī)格化
?(6)標號:FCLR功能:浮點數清零
入口條件:操作數在[R0]中。
?出口信息:操作數被清零。
?影響資源:A堆棧需求:2字節(jié)
FCLR:INCR0
?INCR0
CLRA
MOV@R0,A
DECR0
MOV@R0,A
DECR0
?MOV@R0,#41H
?RET
(7)標號:FZER功能:浮點數判零
?
入口條件:操作數在[R0]中。
?出口信息:若累加器A為零,則操作數[R0]為零,否則不為零。
?影響資源:A堆棧需求:2字節(jié)
?FZER:INCR0
INCR0
?MOVA,@R0
DECR0
ORLA,@R0
?DECR0
JNZZERO
?MOV@R0,#41H
?ZERO:RET
?(8)標號:FMOV功能:浮點數傳送
入口條件:源操作數在[R1]中,目標地址為[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)標號:FPUS功能:浮點數壓棧
入口條件:操作數在[R0]中。
出口信息:操作數壓入棧頂。
影響資源:A、R2、R3堆棧需求:5字節(jié)
?FPUS:POPACC;將返回地址保存在R2R3中
MOVR2,A
?POPACC
?MOVR3,A
MOVA,@R0;將操作數壓入堆棧
PUSHACC
INCR0
MOVA,@R0
?PUSHACC
INCR0
?MOVA,@R0
PUSHACC
DECR0
DECR0
MOVA,R3;將返回地址壓入堆棧
PUSHACC
MOVA,R2
?PUSHACC
?RET;返回主程序
?(10)標號:FPOP功能:浮點數出棧
入口條件:操作數處于棧頂。
?出口信息:操作數彈至[R0]中。
影響資源:A、R2、R3堆棧需求:2字節(jié)
?FPOP:POPACC;將返回地址保存在R2R3中
?MOVR2,A
POPACC
?MOVR3,A
INCR0
?INCR0
?POPACC;將操作數彈出堆棧,傳送到[R0]中
?MOV@R0,A
DECR0
POPACC
MOV@R0,A
DECR0
POPACC
?MOV@R0,A
MOVA,R3;將返回地址壓入堆棧
PUSHACC
?MOVA,R2
?PUSHACC
RET;返回主程序
(11)標號:FCMP功能:浮點數代數值比較(不影響待比較操作數)
?入口條件:待比較操作數分別在[R0]和[R1]中。
?出口信息:若CY=1,則[R0]〈[R1],若CY=0且A=0則[R0]=[R1],否則[R0]>[R1].
影響資源:A、B、PSW堆棧需求:2字節(jié)
?FCMP:MOVA,@R0;數符比較
?XRLA,@R1
?JNBACC。7,CMP2
?MOVA,@R0;兩數異號,以[R0]數符為準
RLCA
?MOVA,#0FFH
RET
?CMP2:MOVA,@R1;兩數同號,準備比較階碼
?MOVC,ACC。6
?MOVACC。7,C
MOVB,A
MOVA,@R0
?MOVC,ACC.7
MOVF0,C;保存[R0]的數符
MOVC,ACC。6
?MOVACC。7,C
CLRC;比較階碼
?SUBBA,B
JZCMP6
?RLCA;取階碼之差的符號
?JNBF0,CMP5
?CPLC;[R0]為負時,結果取反
CMP5:MOVA,#0FFH;兩數不相等
?RET
CMP6:INCR0;階碼相同時,準備比較尾數
?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]為負時,結果取反
CMP7:RET
?(12)標號:FABS功能:浮點絕對值函數
?入口條件:操作數在[R0]中。
?出口信息:結果仍在[R0]中。
?影響資源:A堆棧需求:2字節(jié)
FABS:MOVA,@R0;讀取操作數的階碼
CLRACC.7;清除數符
MOV@R0,A;回傳階碼
?RET
(13)標號:FSGN功能:浮點符號函數
?入口條件:操作數在[R0]中。
?出口信息:累加器A=1時為正數,A=0FFH時為負數,A=0時為零.
影響資源:PSW、A堆棧需求:2字節(jié)
FSGN:INCR0;讀尾數
MOVA,@R0
INCR0
ORLA,@R0
?DECR0
DECR0
?JNZSGN
RET;尾數為零,結束
SGN:MOVA,@R0;讀取操作數的階碼
?RLCA;取數符
?MOVA,#1;按正數初始化
JNCSGN1;是正數,結束
MOVA,#0FFH;是負數,改變標志
SGN1:RET
?(14)標號:FINT功能:浮點取整函數
入口條件:操作數在[R0]中。
?出口信息:結果仍在[R0]中.
影響資源:PSW、A、R2、R3、R4、位1FH堆棧需求:6字節(jié)
?FINT:LCALLMVR0;將[R0]傳送到第一工作區(qū)中
?LCALLINT;在工作寄存器中完成取整運算
LJMPMOV0;將結果傳回到[R0]中
INT:MOVA,R3
ORLA,R4
?JNZINTA
?CLR1FH;尾數為零,階碼也清零,結束取整
MOVR2,#41H
RET
INTA:MOVA,R2
JZINTB;階碼為零否?
JBACC。7,INTB;階符為負否?
?CLRC
?SUBBA,#10H;階碼小于16否?
JCINTD
?RET;階碼大于16,已經是整數
INTB:CLRA;絕對值小于一,取整后正數為零,負數為負一
MOVR4,A
?MOVC,1FH
RRCA
MOVR3,A
RLA
?MOVR2,A
JNZINTC
?MOVR2,#41H
?INTC:RET
?INTD:CLRF0;舍尾標志初始化
INTE:CLRC
LCALLRR1;右規(guī)一次
?ORLC,F0;記憶舍尾情況
MOVF0,C
CJNER2,#10H,INTE;階碼達到16(尾數完全為整數)否?
JNBF0,INTF;舍去部分為零否?
JNB1FH,INTF;操作數為正數否?
INCR4;對于帶小數的負數,向下取整
?MOVA,R4
JNZINTF
?INCR3
INTF:LJMPRLN;將結果規(guī)格化
(15)標號:FRCP功能:浮點倒數函數
入口條件:操作數在[R0]中。
出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
?影響資源:PSW、A、B、R2~R7、位1EH、1FH堆棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024七年級英語下冊 Unit 6 Seasons Lesson 32 I Can't Wait for Winter說課稿(新版)冀教版
- DB37-T 4428-2021 瀝青路面裂縫處理技術規(guī)程
- 公開對外招標合同范本
- 假山綠化合同范本
- 農村一戶一宅合同范例
- 主題報道合同范本
- 城市公共交通系統安全風險防控考核試卷
- 上海物業(yè)消防維保合同范本
- 摩托車的風火輪與滑雪場考核試卷
- 搪瓷制品的抗病菌與凈化空氣性考核試卷
- 《供應商質量會議》課件
- 江蘇省科技企業(yè)孵化器孵化能力評價研究的中期報告
- 供應商審核培訓教程
- 酒精性肝硬化伴食管胃底靜脈曲張破裂出血的護理查房
- 無人機巡檢方案完整版
- 備課專業(yè)化讀書分享課件
- 《爆破作業(yè)單位許可證》申請表
- Link 16協議開發(fā)和關鍵技術研究的開題報告
- 激素性白內障的健康宣教
- 全冊(教學設計)-蘇教版勞動六年級下冊
- 尺寸鏈的計算表格
評論
0/150
提交評論