?? MCS-51定點(diǎn)運(yùn)算子程序庫(kù)及其使用說(shuō)明.txt
字號(hào):
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數(shù)據(jù)個(gè)數(shù)
DEC A ;減一,得到需要比較的次數(shù)
JZ MME ;只有一個(gè)數(shù)據(jù),不需要比較
MOV R1,A ;保存比較次數(shù)
PUSH DPL ;保護(hù)數(shù)據(jù)塊的首址
PUSH DPH
MM1: INC DPTR ;指向一個(gè)新的數(shù)據(jù)
MOVX A,@DPTR ;讀取這個(gè)數(shù)據(jù)
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JC MM2 ;不超過(guò)當(dāng)前最大值,保持當(dāng)前最大值
MOV R6,B ;超過(guò)當(dāng)前最大值,更新最大值存放地址
MOV R2,DPH ;同時(shí)更新最大值存放地址
MOV R3,DPL
SJMP MM3
MM2: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNC MM3 ;大于或等于當(dāng)前最小值,保持當(dāng)前最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MM3: DJNZ R1,MM1 ;處理完全部數(shù)據(jù)
POP DPH ;恢復(fù)數(shù)據(jù)首址
POP DPL
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: MOV B,R7 ;保存數(shù)據(jù)個(gè)數(shù)
MOVX A,@DPTR ;讀取第一個(gè)數(shù)據(jù)
MOV R6,A ;作為最大值的初始值
MOV R7,A ;也作為最小值的初始值
MOV A,DPL ;取第一個(gè)數(shù)據(jù)的地址
MOV R3,A ;作為最大值存放地址的初始值
MOV R5,A ;也作為最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取數(shù)據(jù)個(gè)數(shù)
DEC A ;減一,得到需要比較的次數(shù)
JZ MMSE ;只有一個(gè)數(shù)據(jù),不需要比較
MOV R1,A ;保存比較次數(shù)
PUSH DPL ;保護(hù)數(shù)據(jù)塊的首址
PUSH DPH
MMS1: INC DPTR ;調(diào)整數(shù)據(jù)指針
MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)
MOV B,A ;保存
SETB C ;與最大值比較
SUBB A,R6
JZ MMS4 ;相同,不更新最大值
JNB OV,MMS2 ;差未溢出,符號(hào)位有效
CPL ACC.7 ;差溢出,符號(hào)位取反
MMS2: JB ACC.7,MMS4;差為負(fù),不更新最大值
MOV R6,B ;更新最大值
MOV R2,DPH ;更新最大值存放地址
MOV R3,DPL
SJMP MMS7
MMS4: MOV A,B ;與最小值比較
CLR C
SUBB A,R7
JNB OV,MMS6 ;差未溢出,符號(hào)位有效
CPL ACC.7 ;差溢出,符號(hào)位取反
MMS6: JNB ACC.7,MMS7;差為正,不更新最小值
MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MMS7: DJNZ R1,MMS1 ;處理完全部數(shù)據(jù)
POP DPH ;恢復(fù)數(shù)據(jù)首址
POP DPL
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: MOV B,A ;保存待查找的內(nèi)容
MOV R2,#0 ;順序號(hào)初始化(指向表首)
MOV A,R7 ;保存表格的長(zhǎng)度
MOV R6,A
FD11: MOV A,R2 ;按順序號(hào)讀取表格內(nèi)容
MOVC A,@A+DPTR
CJNE A,B,FD12;與待查找的內(nèi)容比較
CLR OV ;相同,查找成功
MOV A,R2 ;取對(duì)應(yīng)的順序號(hào)
RET
FD12: INC R2 ;指向表格中的下一個(gè)內(nèi)容
DJNZ R6,FD11 ;查完全部表格內(nèi)容
SETB OV ;未查找到,失敗
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: MOV A,R7 ;保存表格中數(shù)據(jù)的個(gè)數(shù)
MOV R6,A
MOV R2,#0 ;順序號(hào)初始化(指向表首)
FD21: CLR A ;讀取表格內(nèi)容的高字節(jié)
MOVC A,@A+DPTR
XRL A,R4 ;與待查找內(nèi)容的高字節(jié)比較
JNZ FD22
MOV A,#1 ;讀取表格內(nèi)容的低字節(jié)
MOVC A,@A+DPTR
XRL A,R5 ;與待查找內(nèi)容的低字節(jié)比較
JNZ FD22
CLR OV ;相同,查找成功
MOV A,R2 ;取對(duì)應(yīng)的順序號(hào)
RET
FD22: INC DPTR ;指向下一個(gè)數(shù)據(jù)
INC DPTR
INC R2 ;順序號(hào)加一
DJNZ R6,FD21 ;查完全部數(shù)據(jù)
SETB OV ;未查找到,失敗
RET
(28) 標(biāo)號(hào):FDD1 功能:對(duì)分查找(ROM)單字節(jié)無(wú)符號(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: MOV B,A ;保存待查找的內(nèi)容
MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個(gè)數(shù)據(jù))
MOV A,R7
DEC A
MOV R3,A ;區(qū)間高端指針初始化(指向最后一個(gè)數(shù)據(jù))
FD61: CLR C ;判斷區(qū)間大小
MOV A,R3
SUBB A,R2
JC FD69 ;區(qū)間消失,查找失敗
RRC A ;取區(qū)間大小的一半
ADD A,R2 ;加上區(qū)間的低端
MOV R4,A ;得到區(qū)間的中心
MOVC A,@A+DPTR;讀取該點(diǎn)的內(nèi)容
CJNE A,B,FD65;與待查找的內(nèi)容比較
CLR OV ;相同,查找成功
MOV A,R4 ;取順序號(hào)
RET
FD65: JC FD68 ;該點(diǎn)的內(nèi)容比待查找的內(nèi)容大否?
MOV A,R4 ;偏大,取該點(diǎn)位置
DEC A ;減一
MOV R3,A ;作為新的區(qū)間高端
SJMP FD61 ;繼續(xù)查找
FD68: MOV A,R4 ;偏小,取該點(diǎn)位置
INC A ;加一
MOV R2,A ;作為新的區(qū)間低端
SJMP FD61 ;繼續(xù)查找
FD69: SETB OV ;查找失敗
RET
(29) 標(biāo)號(hào):FDD2 功能:對(duì)分查找(ROM)雙字節(jié)無(wú)符號(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: MOV R2,#0 ;區(qū)間低端指針初始化(指向第一個(gè)數(shù)據(jù))
MOV A,R7
DEC A
MOV R3,A ;區(qū)間高端指針初始化,指向最后一個(gè)數(shù)據(jù)
MOV R6,DPH ;保存表格首址
MOV R7,DPL
FD81: CLR C ;判斷區(qū)間大小
MOV A,R3
SUBB A,R2
JC FD89 ;區(qū)間消失,查找失敗
RRC A ;取區(qū)間大小的一半
ADD A,R2 ;加上區(qū)間的低端
MOV R1,A ;得到區(qū)間的中心
MOV DPH,R6
CLR C ;計(jì)算區(qū)間中心的地址
RLC A
JNC FD82
INC DPH
FD82: ADD A,R7
MOV DPL,A
JNC FD83
INC DPH
FD83: CLR A ;讀取該點(diǎn)的內(nèi)容的高字節(jié)
MOVC A,@A+DPTR
MOV B,R4 ;與待查找內(nèi)容的高字節(jié)比較
CJNE A,B,FD84;不相同
MOV A,#1 ;讀取該點(diǎn)的內(nèi)容的低字節(jié)
MOVC A,@A+DPTR
MOV B,R5
CJNE A,B,FD84;與待查找內(nèi)容的低字節(jié)比較
MOV A,R1 ;取順序號(hào)
CLR OV ;查找成功
RET
FD84: JC FD86 ;該點(diǎn)的內(nèi)容比待查找的內(nèi)容大否?
MOV A,R1 ;偏大,取該點(diǎn)位置
DEC A ;減一
MOV R3,A ;作為新的區(qū)間高端
SJMP FD81 ;繼續(xù)查找
FD86: MOV A,R1 ;偏小,取該點(diǎn)位置
INC A ;加一
MOV R2,A ;作為新的區(qū)間低端
SJMP FD81 ;繼續(xù)查找
FD89: MOV DPH,R6 ;相同,恢復(fù)首址
MOV DPL,R7
SETB OV ;查找失敗
RET
(30) 標(biāo)號(hào): DDM1 功能:求單字節(jié)十六進(jìn)制無(wú)符號(hào)數(shù)據(jù)塊的平均值
入口條件:數(shù)據(jù)塊的首址在DPTR中,數(shù)據(jù)個(gè)數(shù)在R7中。
出口信息:平均值在累加器A中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節(jié)
DDM1: MOV A,R7 ;保存數(shù)據(jù)個(gè)數(shù)
MOV R2,A
PUSH DPH
PUSH DPL
CLR A ;初始化累加和
MOV R4,A
MOV R5,A
DM11: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)
ADD A,R5 ;累加到累加和中
MOV R5,A
JNC DM12
INC R4
DM12: INC DPTR ;調(diào)整指針
DJNZ R2,DM11 ;累加完全部數(shù)據(jù)
LCALL D457 ;求平均值(R4R5/R7-→R3)
MOV A,R3 ;取平均值
POP DPL
POP DPH
RET
(31) 標(biāo)號(hào): DDM2 功能:求雙字節(jié)十六進(jìn)制無(wú)符號(hào)數(shù)據(jù)塊的平均值
入口條件:數(shù)據(jù)塊的首址在DPTR中,雙字節(jié)數(shù)據(jù)總個(gè)數(shù)在R7中。
出口信息:平均值在R4、R5中。
影響資源:PSW、A、R2~R6 堆棧需求: 4字節(jié)
DDM2: MOV A,R7 ;保存數(shù)據(jù)個(gè)數(shù)
MOV R2,A ;初始化數(shù)據(jù)指針
PUSH DPL ;保持首址
PUSH DPH
CLR A ;初始化累加和
MOV R3,A
MOV R4,A
MOV R5,A
DM20: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的高字節(jié)
MOV B,A
INC DPTR
MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的低字節(jié)
INC DPTR
ADD A,R5 ;累加到累加和中
MOV R5,A
MOV A,B
ADDC A,R4
MOV R4,A
JNC DM21
INC R3
DM21: DJNZ R2,DM20 ;累加完全部數(shù)據(jù)
POP DPH ;恢復(fù)首址
POP DPL
LJMP DV31 ;求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: MOV R4,DPH ;保存數(shù)據(jù)塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節(jié)計(jì)數(shù)器調(diào)整
JZ XR10
INC R6
XR10: MOV B,#0 ;校驗(yàn)和初始化
XR11: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)
XRL B,A ;異或運(yùn)算
INC DPTR ;指向下一個(gè)數(shù)據(jù)
DJNZ R7,XR11 ;雙字節(jié)計(jì)數(shù)器減一
DJNZ R6,XR11
MOV DPH,R4 ;恢復(fù)數(shù)據(jù)首址
MOV DPL,R5
MOV A,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: MOV R4,DPH ;保存數(shù)據(jù)塊的首址
MOV R5,DPL
MOV A,R7 ;雙字節(jié)計(jì)數(shù)器調(diào)整
JZ XR20
INC R6
XR20: CLR A ;校驗(yàn)和初始化
MOV R2,A
MOV R3,A
XR21: MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的高字節(jié)
XRL A,R2 ;異或運(yùn)算
MOV R2,A
INC DPTR
MOVX A,@DPTR ;讀取一個(gè)數(shù)據(jù)的低字節(jié)
XRL A,R3 ;異或運(yùn)算
MOV R3,A
INC DPTR ;指向下一個(gè)數(shù)據(jù)
DJNZ R7,XR21 ;雙字節(jié)計(jì)數(shù)器減一
DJNZ R6,XR21
MOV DPH,R4 ;恢復(fù)數(shù)據(jù)首址
MOV DPL,R5
RET
(34) 標(biāo)號(hào): SORT 功能:?jiǎn)巫止?jié)無(wú)符號(hào)數(shù)據(jù)塊排序(增序)
入口條件:數(shù)據(jù)塊的首址在R0中,字節(jié)數(shù)在R7中。
出口信息:完成排序(增序)
影響資源:PSW、A、R2~R6 堆棧需求: 2字節(jié)
SORT: MOV A,R7
MOV R5,A ;比較次數(shù)初始化
SRT1: CLR F0 ;交換標(biāo)志初始化
MOV A,R5 ;取上遍比較次數(shù)
DEC A ;本遍比上遍減少一次
MOV R5,A ;保存本遍次數(shù)
MOV R2,A ;復(fù)制到計(jì)數(shù)器中
JZ SRT5 ;若為零,排序結(jié)束
MOV A,R0 ;保存數(shù)據(jù)指針
MOV R6,A
SRT2: MOV A,@R0 ;讀取一個(gè)數(shù)據(jù)
MOV R3,A
INC R0 ;指向下一個(gè)數(shù)據(jù)
MOV A,@R0 ;再讀取一個(gè)數(shù)據(jù)
MOV R4,A
CLR C
SUBB A,R3 ;比較兩個(gè)數(shù)據(jù)的大小
JNC SRT4 ;順序正確(增序或相同),不必交換
SETB F0 ;設(shè)立交換標(biāo)志
MOV A,R3 ;將兩個(gè)數(shù)據(jù)交換位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一個(gè)數(shù)據(jù)
SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數(shù)
MOV A,R6 ;恢復(fù)數(shù)據(jù)首址
MOV R0,A
JB F0,SRT1 ;本遍若進(jìn)行過(guò)交換,則需繼續(xù)排序
SRT5: RET ;排序結(jié)束
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -