51定點(diǎn)運(yùn)算子程序庫及其使用說明_第1頁
51定點(diǎn)運(yùn)算子程序庫及其使用說明_第2頁
51定點(diǎn)運(yùn)算子程序庫及其使用說明_第3頁
51定點(diǎn)運(yùn)算子程序庫及其使用說明_第4頁
51定點(diǎn)運(yùn)算子程序庫及其使用說明_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論