📄 i5_5_01_01.htm
字号:
<p ALIGN="JUSTIFY">(19) 标号: HBD2
功能:双字节十六进制小数转换成双字节BCD码小数</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:待转换的双字节十六进制小数在R2、R3中。</p>
<p ALIGN="JUSTIFY">出口信息:转换后的双字节BCD码小数仍在R2、R3中。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R2、R3、R4、R5 堆栈需求:
6字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">HBD2: MOV R4,#4 ;四位十进制码</p>
<p ALIGN="JUSTIFY">HBD3: MOV A,R3 ;原小数扩大十倍</p>
<p ALIGN="JUSTIFY">MOV B,#10</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV R5,B</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">MOV B,#10</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">ADD A,R5</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">CLR A</p>
<p ALIGN="JUSTIFY">ADDC A,B</p>
<p ALIGN="JUSTIFY">PUSH ACC ;保存溢出的一位十进制码</p>
<p ALIGN="JUSTIFY">DJNZ R4,HBD3 ;计算完四位十进制码</p>
<p ALIGN="JUSTIFY">POP ACC ;取出万分位</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">POP ACC ;取出千分位</p>
<p ALIGN="JUSTIFY">SWAP A</p>
<p ALIGN="JUSTIFY">ORL A,R3 ;拼装成低字节BCD码小数</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">POP ACC ;取出百分位</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">POP ACC ;取出十分位</p>
<p ALIGN="JUSTIFY">SWAP A</p>
<p ALIGN="JUSTIFY">ORL A,R2 ;拼装成高字节BCD码小数</p>
<p ALIGN="JUSTIFY">MOV R2,A </p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(20)标号:BCDH
功能:单字节BCD码整数转换成单字节十六进制整数</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:待转换的单字节BCD码整数在累加器A中。</p>
<p ALIGN="JUSTIFY">出口信息:转换后的单字节十六进制整数仍在累加器A中。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R4 堆栈需求: 2字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BCDH: MOV B,#10H ;分离十位和个位</p>
<p ALIGN="JUSTIFY">DIV AB</p>
<p ALIGN="JUSTIFY">MOV R4,B ;暂存个位</p>
<p ALIGN="JUSTIFY">MOV B,#10 ;将十位转换成十六进制</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">ADD A,R4 ;按十六进制加上个位</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(21)标号: BH2
功能:双字节BCD码整数转换成双字节十六进制整数</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:待转换的双字节BCD码整数在R2、R3中。</p>
<p ALIGN="JUSTIFY">出口信息:转换后的双字节十六进制整数仍在R2、R3中。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R2、R3、R4 堆栈需求: 4字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BH2: MOV A,R3 ;将低字节转换成十六进制</p>
<p ALIGN="JUSTIFY">LCALL BCDH</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2 ;将高字节转换成十六进制</p>
<p ALIGN="JUSTIFY">LCALL BCDH</p>
<p ALIGN="JUSTIFY">MOV B,#100 ;扩大一百倍</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">ADD A,R3 ;和低字节按十六进制相加</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">CLR A</p>
<p ALIGN="JUSTIFY">ADDC A,B</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(22)标号: BHD
功能:单字节BCD码小数转换成单字节十六进制小数</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:待转换的单字节BCD码数在累加器A中。</p>
<p ALIGN="JUSTIFY">出口信息:转换后的单字节十六进制小数仍在累加器A中。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、R2、R3 堆栈需求: 2字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BHD: MOV R2,#8 ;准备计算一个字节小数</p>
<p ALIGN="JUSTIFY">BHD0: ADD A,ACC ;按十进制倍增</p>
<p ALIGN="JUSTIFY">DA A</p>
<p ALIGN="JUSTIFY">XCH A,R3</p>
<p ALIGN="JUSTIFY">RLC A ;将进位标志移入结果中</p>
<p ALIGN="JUSTIFY">XCH A,R3</p>
<p ALIGN="JUSTIFY">DJNZ R2,BHD0 ;共计算8bit小数</p>
<p ALIGN="JUSTIFY">ADD A,#0B0H ;剩余部分达到0.50否?</p>
<p ALIGN="JUSTIFY">JNC BHD1 ;四舍</p>
<p ALIGN="JUSTIFY">INC R3 ;五入</p>
<p ALIGN="JUSTIFY">BHD1: MOV A,R3 ;取结果</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(23)标号: BHD2
功能:双字节BCD码小数转换成双字节十六进制小数</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:待转换的双字节BCD码小数在R4、R5中。</p>
<p ALIGN="JUSTIFY">出口信息:转换后的双字节十六进制小数在R2、R3中。*</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、R2~R6 堆栈需求: 2字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BHD2: MOV R6,#10H ;准备计算两个字节小数</p>
<p ALIGN="JUSTIFY">BHD3: MOV A,R5 ;按十进制倍增</p>
<p ALIGN="JUSTIFY">ADD A,R5</p>
<p ALIGN="JUSTIFY">DA A</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV A,R4</p>
<p ALIGN="JUSTIFY">ADDC A,R4</p>
<p ALIGN="JUSTIFY">DA A</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV A,R3 ;将进位标志移入结果中</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">DJNZ R6,BHD3 ;共计算16bit小数</p>
<p ALIGN="JUSTIFY">MOV A,R4</p>
<p ALIGN="JUSTIFY">ADD A,#0B0H ;剩余部分达到0.50否?</p>
<p ALIGN="JUSTIFY">JNC BHD4 ;四舍</p>
<p ALIGN="JUSTIFY">INC R3 ;五入</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">JNZ BHD4</p>
<p ALIGN="JUSTIFY">INC R2</p>
<p ALIGN="JUSTIFY">BHD4: RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(24) 标号: MM
功能:求单字节十六进制无符号数据块的极值</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:数据块的首址在DPTR中,数据个数在R7中。</p>
<p ALIGN="JUSTIFY">出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">MM: MOV B,R7 ;保存数据个数</p>
<p ALIGN="JUSTIFY">MOVX A,@DPTR ;读取第一个数据</p>
<p ALIGN="JUSTIFY">MOV R6,A ;作为最大值的初始值</p>
<p ALIGN="JUSTIFY">MOV R7,A ;也作为最小值的初始值</p>
<p ALIGN="JUSTIFY">MOV A,DPL ;取第一个数据的地址</p>
<p ALIGN="JUSTIFY">MOV R3,A ;作为最大值存放地址的初始值</p>
<p ALIGN="JUSTIFY">MOV R5,A ;也作为最小值存放地址的初始值</p>
<p ALIGN="JUSTIFY">MOV A,DPH</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV A,B ;取数据个数</p>
<p ALIGN="JUSTIFY">DEC A ;减一,得到需要比较的次数</p>
<p ALIGN="JUSTIFY">JZ MME ;只有一个数据,不需要比较</p>
<p ALIGN="JUSTIFY">MOV R1,A ;保存比较次数</p>
<p ALIGN="JUSTIFY">PUSH DPL ;保护数据块的首址</p>
<p ALIGN="JUSTIFY">PUSH DPH</p>
<p ALIGN="JUSTIFY">MM1: INC DPTR ;指向一个新的数据</p>
<p ALIGN="JUSTIFY">MOVX A,@DPTR ;读取这个数据</p>
<p ALIGN="JUSTIFY">MOV B,A ;保存</p>
<p ALIGN="JUSTIFY">SETB C ;与最大值比较</p>
<p ALIGN="JUSTIFY">SUBB A,R6</p>
<p ALIGN="JUSTIFY">JC MM2 ;不超过当前最大值,保持当前最大值</p>
<p ALIGN="JUSTIFY">MOV R6,B ;超过当前最大值,更新最大值存放地址</p>
<p ALIGN="JUSTIFY">MOV R2,DPH ;同时更新最大值存放地址</p>
<p ALIGN="JUSTIFY">MOV R3,DPL</p>
<p ALIGN="JUSTIFY">SJMP MM3</p>
<p ALIGN="JUSTIFY">MM2: MOV A,B ;与最小值比较</p>
<p ALIGN="JUSTIFY">CLR C</p>
<p ALIGN="JUSTIFY">SUBB A,R7</p>
<p ALIGN="JUSTIFY">JNC MM3 ;大于或等于当前最小值,保持当前最小值</p>
<p ALIGN="JUSTIFY">MOV R7,B ;更新最小值</p>
<p ALIGN="JUSTIFY">MOV R4,DPH ;更新最小值存放地址</p>
<p ALIGN="JUSTIFY">MOV R5,DPL</p>
<p ALIGN="JUSTIFY">MM3: DJNZ R1,MM1 ;处理完全部数据</p>
<p ALIGN="JUSTIFY">POP DPH ;恢复数据首址</p>
<p ALIGN="JUSTIFY">POP DPL</p>
<p ALIGN="JUSTIFY">MME: RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(25) 标号: MMS
功能:求单字节十六进制有符号数据块的极值</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:数据块的首址在DPTR中,数据个数在R7中。</p>
<p ALIGN="JUSTIFY">出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">MMS: MOV B,R7 ;保存数据个数</p>
<p ALIGN="JUSTIFY">MOVX A,@DPTR ;读取第一个数据</p>
<p ALIGN="JUSTIFY">MOV R6,A ;作为最大值的初始值</p>
<p ALIGN="JUSTIFY">MOV R7,A ;也作为最小值的初始值</p>
<p ALIGN="JUSTIFY">MOV A,DPL ;取第一个数据的地址</p>
<p ALIGN="JUSTIFY">MOV R3,A ;作为最大值存放地址的初始值</p>
<p ALIGN="JUSTIFY">MOV R5,A ;也作为最小值存放地址的初始值</p>
<p ALIGN="JUSTIFY">MOV A,DPH</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV A,B ;取数据个数</p>
<p ALIGN="JUSTIFY">DEC A ;减一,得到需要比较的次数</p>
<p ALIGN="JUSTIFY">JZ MMSE ;只有一个数据,不需要比较</p>
<p ALIGN="JUSTIFY">MOV R1,A ;保存比较次数</p>
<p ALIGN="JUSTIFY">PUSH DPL ;保护数据块的首址</p>
<p ALIGN="JUSTIFY">PUSH DPH</p>
<p ALIGN="JUSTIFY">MMS1: INC DPTR ;调整数据指针</p>
<p ALIGN="JUSTIFY">MOVX A,@DPTR ;读取一个数据</p>
<p ALIGN="JUSTIFY">MOV B,A ;保存</p>
<p ALIGN="JUSTIFY">SETB C ;与最大值比较</p>
<p ALIGN="JUSTIFY">SUBB A,R6</p>
<p ALIGN="JUSTIFY">JZ MMS4 ;相同,不更新最大值</p>
<p ALIGN="JUSTIFY">JNB OV,MMS2 ;差未溢出,符号位有效</p>
<p ALIGN="JUSTIFY">CPL ACC.7 ;差溢出,符号位取反</p>
<p ALIGN="JUSTIFY">MMS2: JB ACC.7,MMS4;差为负,不更新最大值</p>
<p ALIGN="JUSTIFY">MOV R6,B ;更新最大值</p>
<p ALIGN="JUSTIFY">MOV R2,DPH ;更新最大值存放地址</p>
<p ALIGN="JUSTIFY">MOV R3,DPL</p>
<p ALIGN="JUSTIFY">SJMP MMS7</p>
<p ALIGN="JUSTIFY">MMS4: MOV A,B ;与最小值比较</p>
<p ALIGN="JUSTIFY">CLR C</p>
<p ALIGN="JUSTIFY">SUBB A,R7</p>
<p ALIGN="JUSTIFY">JNB OV,MMS6 ;差未溢出,符号位有效</p>
<p ALIGN="JUSTIFY">CPL ACC.7 ;差溢出,符号位取反</p>
<p ALIGN="JUSTIFY">MMS6: JNB ACC.7,MMS7;差为正,不更新最小值</p>
<p ALIGN="JUSTIFY">MOV R7,B ;更新最小值</p>
<p ALIGN="JUSTIFY">MOV R4,DPH ;更新最小值存放地址</p>
<p ALIGN="JUSTIFY">MOV R5,DPL</p>
<p ALIGN="JUSTIFY">MMS7: DJNZ R1,MMS1 ;处理完全部数据</p>
<p ALIGN="JUSTIFY">POP DPH ;恢复数据首址</p>
<p ALIGN="JUSTIFY">POP DPL</p>
<p ALIGN="JUSTIFY">MMSE: RET </p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(26) 标号: FDS1
功能:顺序查找(ROM)单字节表格</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。</p>
<p ALIGN="JUSTIFY">出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。</p>
<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R2、R6 堆栈需求: 2字节</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">FDS1: MOV B,A ;保存待查找的内容</p>
<p ALIGN="JUSTIFY">MOV R2,#0 ;顺序号初始化(指向表首)</p>
<p ALIGN="JUSTIFY">MOV A,R7 ;保存表格的长度</p>
<p ALIGN="JUSTIFY">MOV R6,A</p>
<p ALIGN="JUSTIFY">FD11: MOV A,R2 ;按顺序号读取表格内容</p>
<p ALIGN="JUSTIFY">MOVC A,@A+DPTR</p>
<p ALIGN="JUSTIFY">CJNE A,B,FD12;与待查找的内容比较</p>
<p ALIGN="JUSTIFY">CLR OV ;相同,查找成功</p>
<p ALIGN="JUSTIFY">MOV A,R2 ;取对应的顺序号</p>
<p ALIGN="JUSTIFY">RET </p>
<p ALIGN="JUSTIFY">FD12: INC R2 ;指向表格中的下一个内容</p>
<p ALIGN="JUSTIFY">DJNZ R6,FD11 ;查完全部表格内容</p>
<p ALIGN="JUSTIFY">SETB OV ;未查找到,失败</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -