📄 51.lst
字号:
02D2 5001 774 JNC BHD1 ;四舍
02D4 0B 775 INC R3 ;五入
02D5 EB 776 BHD1: MOV A,R3 ;取结果
02D6 22 777 RET
778
779 ;(23)标号:BHD2 功能:双字节BCD码小数转换成双字节十六进制小数
780
781 ;入口条件:待转换的双字节BCD码小数在R4、R5中。
782 ;出口信息:转换后的双字节十六进制小数在R2、R3中。*
783 ;影响资源:PSW、A、R2~R6 堆栈需求: 2字节
784
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 13
785
02D7 7E10 786 BHD2: MOV R6,#10H ;准备计算两个字节小数
02D9 ED 787 BHD3: MOV A,R5 ;按十进制倍增
02DA 2D 788 ADD A,R5
02DB D4 789 DA A
02DC FD 790 MOV R5,A
02DD EC 791 MOV A,R4
02DE 3C 792 ADDC A,R4
02DF D4 793 DA A
02E0 FC 794 MOV R4,A
02E1 EB 795 MOV A,R3 ;将进位标志移入结果中
02E2 33 796 RLC A
02E3 FB 797 MOV R3,A
02E4 EA 798 MOV A,R2
02E5 33 799 RLC A
02E6 FA 800 MOV R2,A
02E7 DEF0 801 DJNZ R6,BHD3 ;共计算16bit小数
02E9 EC 802 MOV A,R4
02EA 24B0 803 ADD A,#0B0H ;剩余部分达到0.50否?
02EC 5005 804 JNC BHD4 ;四舍
02EE 0B 805 INC R3 ;五入
02EF EB 806 MOV A,R3
02F0 7001 807 JNZ BHD4
02F2 0A 808 INC R2
02F3 22 809 BHD4: RET
810
811 ;(24)标号:MM 功能:求单字节十六进制无符号数据块的极值
812
813 ;入口条件:数据块的首址在DPTR中,数据个数在R7中。
814 ;出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
815 ;影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节
816
02F4 8FF0 817 MM: MOV B,R7 ;保存数据个数
02F6 E0 818 MOVX A,@DPTR ;读取第一个数据
02F7 FE 819 MOV R6,A ;作为最大值的初始值
02F8 FF 820 MOV R7,A ;也作为最小值的初始值
02F9 E582 821 MOV A,DPL ;取第一个数据的地址
02FB FB 822 MOV R3,A ;作为最大值存放地址的初始值
02FC FD 823 MOV R5,A ;也作为最小值存放地址的初始值
02FD E583 824 MOV A,DPH
02FF FA 825 MOV R2,A
0300 FC 826 MOV R4,A
827
0301 E5F0 828 MOV A,B ;取数据个数
0303 14 829 DEC A ;减一,得到需要比较的次数
0304 6027 830 JZ MME ;只有一个数据,不需要比较
0306 F9 831 MOV R1,A ;保存比较次数
0307 C082 832 PUSH DPL ;保护数据块的首址
0309 C083 833 PUSH DPH
030B A3 834 MM1: INC DPTR ;指向一个新的数据
030C E0 835 MOVX A,@DPTR ;读取这个数据
030D F5F0 836 MOV B,A ;保存
030F D3 837 SETB C ;与最大值比较
0310 9E 838 SUBB A,R6
0311 4008 839 JC MM2 ;不超过当前最大值,保持当前最大值
0313 AEF0 840 MOV R6,B ;超过当前最大值,更新最大值存放地址
0315 AA83 841 MOV R2,DPH ;同时更新最大值存放地址
0317 AB82 842 MOV R3,DPL
0319 800C 843 SJMP MM3
031B E5F0 844 MM2: MOV A,B ;与最小值比较
845
031D C3 846 CLR C
031E 9F 847 SUBB A,R7
031F 5006 848 JNC MM3 ;大于或等于当前最小值,保持当前最小值
0321 AFF0 849 MOV R7,B ;更新最小值
0323 AC83 850 MOV R4,DPH ;更新最小值存放地址
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 14
0325 AD82 851 MOV R5,DPL
0327 D9E2 852 MM3: DJNZ R1,MM1 ;处理完全部数据
0329 D083 853 POP DPH ;恢复数据首址
032B D082 854 POP DPL
032D 22 855 MME: RET
856
857 ;(25)标号:MMS 功能:求单字节十六进制有符号数据块的极值
858
859 ;入口条件:数据块的首址在DPTR中,数据个数在R7中。
860 ;出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
861 ;影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节
862
863
032E 8FF0 864 MMS: MOV B,R7 ;保存数据个数
0330 E0 865 MOVX A,@DPTR ;读取第一个数据
0331 FE 866 MOV R6,A ;作为最大值的初始值
0332 FF 867 MOV R7,A ;也作为最小值的初始值
0333 E582 868 MOV A,DPL ;取第一个数据的地址
0335 FB 869 MOV R3,A ;作为最大值存放地址的初始值
0336 FD 870 MOV R5,A ;也作为最小值存放地址的初始值
0337 E583 871 MOV A,DPH
0339 FA 872 MOV R2,A
033A FC 873 MOV R4,A
033B E5F0 874 MOV A,B ;取数据个数
033D 14 875 DEC A ;减一,得到需要比较的次数
033E 6035 876 JZ MMSE ;只有一个数据,不需要比较
0340 F9 877 MOV R1,A ;保存比较次数
0341 C082 878 PUSH DPL ;保护数据块的首址
0343 C083 879 PUSH DPH
880
0345 A3 881 MMS1: INC DPTR ;调整数据指针
0346 E0 882 MOVX A,@DPTR ;读取一个数据
0347 F5F0 883 MOV B,A ;保存
0349 D3 884 SETB C ;与最大值比较
034A 9E 885 SUBB A,R6
034B 6010 886 JZ MMS4 ;相同,不更新最大值
034D 30D202 887 JNB OV,MMS2 ;差未溢出,符号位有效
0350 B2E7 888 CPL ACC.7 ;差溢出,符号位取反
0352 20E708 889 MMS2: JB ACC.7,MMS4 ;差为负,不更新最大值
0355 AEF0 890 MOV R6,B ;更新最大值
0357 AA83 891 MOV R2,DPH ;更新最大值存放地址
0359 AB82 892 MOV R3,DPL
035B 8012 893 SJMP MMS7
035D E5F0 894 MMS4: MOV A,B ;与最小值比较
035F C3 895 CLR C
0360 9F 896 SUBB A,R7
0361 30D202 897 JNB OV,MMS6 ;差未溢出,符号位有效
0364 B2E7 898 CPL ACC.7 ;差溢出,符号位取反
899
0366 30E706 900 MMS6: JNB ACC.7,MMS7 ;差为正,不更新最小值
0369 AFF0 901 MOV R7,B ;更新最小值
036B AC83 902 MOV R4,DPH ;更新最小值存放地址
036D AD82 903 MOV R5,DPL
036F D9D4 904 MMS7: DJNZ R1,MMS1 ;处理完全部数据
0371 D083 905 POP DPH ;恢复数据首址
0373 D082 906 POP DPL
0375 22 907 MMSE: RET
908
909 ;(26)标号:FDS1 功能:顺序查找(ROM)单字节表格
910
911 ;入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。
912 ;出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。
913 ;影响资源:PSW、A、B、R2、R6 堆栈需求: 2字节
914
0376 F5F0 915 FDS1: MOV B,A ;保存待查找的内容
916
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 15
0378 7A00 917 MOV R2,#0 ;顺序号初始化(指向表首)
037A EF 918 MOV A,R7 ;保存表格的长度
037B FE 919 MOV R6,A
037C EA 920 FD11: MOV A,R2 ;按顺序号读取表格内容
037D 93 921 MOVC A,@A+DPTR
037E B5F004 922 CJNE A,B,FD12 ;与待查找的内容比较
0381 C2D2 923 CLR OV ;相同,查找成功
0383 EA 924 MOV A,R2 ;取对应的顺序号
0384 22 925 RET
0385 0A 926 FD12: INC R2 ;指向表格中的下一个内容
0386 DEF4 927 DJNZ R6,FD11 ;查完全部表格内容
0388 D2D2 928 SETB OV ;未查找到,失败
038A 22 929 RET
930
931 ;(27)标号:FDS2 功能:顺序查找(ROM)双字节表格
932
933 ;入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。
934
935 ;出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。
936 ;影响资源:PSW、A、R2、R6、DPTR 堆栈需求: 2字节
937
038B EF 938 FDS2: MOV A,R7 ;保存表格中数据的个数
038C FE 939 MOV R6,A
038D 7A00 940 MOV R2,#0 ;顺序号初始化(指向表首)
038F E4 941 FD21: CLR A ;读取表格内容的高字节
0390 93 942 MOVC A,@A+DPTR
0391 6C 943 XRL A,R4 ;与待查找内容的高字节比较
0392 700A 944 JNZ FD22
0394 7401 945 MOV A,#1 ;读取表格内容的低字节
0396 93 946 MOVC A,@A+DPTR
0397 6D 947 XRL A,R5 ;与待查找内容的低字节比较
0398 7004 948 JNZ FD22
039A C2D2 949 CLR OV ;相同,查找成功
039C EA 950 MOV A,R2 ;取对应的顺序号
951
039D 22 952 RET
039E A3 953 FD22: INC DPTR ;指向下一个数据
039F A3 954 INC DPTR
03A0 0A 955 INC R2 ;顺序号加一
03A1 DEEC 956 DJNZ R6,FD21 ;查完全部数据
03A3 D2D2 957 SETB OV ;未查找到,失败
03A5 22 958 RET
959
960 ;(28)标号:FDD1 功能:对分查找(ROM)单字节无符号增序数据表格
961
962 ;入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。
963 ;出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。
964 ;影响资源:PSW、A、B、R2、R3、R4 堆栈需求: 2字节
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -