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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論